Compare commits
1789 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2065f1e267 | |||
| 5a4b2ba5c5 | |||
| 7726af9c53 | |||
| 733d5fd57d | |||
| d18c834029 | |||
| da8576f642 | |||
| c73d47327b | |||
| 53a82511ff | |||
| 9d3bc551bc | |||
| c2c771a1cc | |||
| a6125b859d | |||
| eea9b6d8ae | |||
| 6131d2c5a6 | |||
| 29ab4f5982 | |||
| 30c9b9bbba | |||
| 0398a0b780 | |||
| 9d1d35f1ed | |||
| 4e9ccffc10 | |||
| 62dc3e7a22 | |||
| 67c1075e47 | |||
| a4e955d606 | |||
| 25053572ec | |||
| 8f59d44e4d | |||
| b99411b62b | |||
| dc202b3cb3 | |||
| 08155b4875 | |||
| c207111cc6 | |||
| 5ceccc95a8 | |||
| 62a595750d | |||
| 0987c3a3a3 | |||
| d099cb3b5a | |||
| 82ea06e6a4 | |||
| 74be64a1ec | |||
| da76381605 | |||
| bc6e90f4ab | |||
| 52ae3e6967 | |||
| dceaeeeaf9 | |||
| dbed009090 | |||
| 25a8bbcbf3 | |||
| b80179d14a | |||
| 605b539ecd | |||
| 5c6a2f4d0d | |||
| 6a32d87e58 | |||
| 214fe90a3b | |||
| e400ef346a | |||
| e60c38b622 | |||
| a80c371340 | |||
| d051495dec | |||
| 2dd25938cc | |||
| dd4990252e | |||
| 0d7075b90c | |||
| 76e80aa400 | |||
| 9398c43112 | |||
| 84fd0eff17 | |||
| 731370051d | |||
| 5fde86406f | |||
| 6d39a6fc55 | |||
| d71b35c24f | |||
| ff0318c5bd | |||
| 92dea8e6cc | |||
| e1921f808c | |||
| d8c4be375c | |||
| aee971bcaf | |||
| 6689e5ed75 | |||
| 43b736906a | |||
| 7c2834c33c | |||
| 464a9f0ab6 | |||
| 8af4d70922 | |||
| 4ea4fa78aa | |||
| 7985f7f116 | |||
| 2de54dab84 | |||
| ad30909a2d | |||
| f4951ed56b | |||
| 2db640ea80 | |||
| 8f0f6c1ac1 | |||
| 67f08ef07f | |||
| 000388b1d9 | |||
| 781b34709b | |||
| 7da4ed7340 | |||
| 29ad42e54e | |||
| e018f041ba | |||
| 49771c4a9e | |||
| 0dae140080 | |||
| 458677c63a | |||
| 02f904dbf9 | |||
| 18b1ccda27 | |||
| 926a7f27c6 | |||
| a6e5492b08 | |||
| abbe3f0dc7 | |||
| 50355f4607 | |||
| 419d67237c | |||
| 90f46d1226 | |||
| ad8c16177e | |||
| 1e189506ef | |||
| 4d7feea72e | |||
| c3a65eef7a | |||
| 9c61e6f1c0 | |||
| ebb75a529b | |||
| 10e5d92dec | |||
| 533ba2ac96 | |||
| 05bb3bde7a | |||
| 7f774cab90 | |||
| 376f0be5da | |||
| 874c531f27 | |||
| 3b4643d31a | |||
| 2a5ab55c36 | |||
| e5b280c309 | |||
| a69e2923dd | |||
| d97c1f1c62 | |||
| 558b60858c | |||
| fe60a18923 | |||
| 90f1436764 | |||
| 9336517258 | |||
| e72fe0ad14 | |||
| 69473daa3d | |||
| 75f76cbf26 | |||
| eb7f75461a | |||
| c8f9a32610 | |||
| b3804fb277 | |||
| 175fac8fe8 | |||
| 75dadcc669 | |||
| 3734e8e02f | |||
| de77dbedf1 | |||
| 10a1ff1622 | |||
| 0d629c80c7 | |||
| 5353a1ed1a | |||
| 0c8a53e507 | |||
| 390878e78a | |||
| 398ce22c2e | |||
| a42760d38a | |||
| e5dc2c5321 | |||
| 0264316797 | |||
| 9746a8427c | |||
| dd16d6ad6e | |||
| 782ced6ff7 | |||
| 61ac1ed2f6 | |||
| 8e56f9366d | |||
| 4a7f5603de | |||
| fff5e9ba4a | |||
| b12d0d06eb | |||
| 49548c343d | |||
| 4588d836a3 | |||
| 4335f4e41f | |||
| c9de9d4f9b | |||
| 6cc45d2578 | |||
| 9f10695b3f | |||
| 42a2b5c3ec | |||
| f95f18c8e5 | |||
| adefecca6c | |||
| 4f2ff42003 | |||
| 98e7e63240 | |||
| 6f494e9bed | |||
| b65cdbed91 | |||
| 57025b75e1 | |||
| 01741576eb | |||
| f09fa69e86 | |||
| a03811f4e8 | |||
| 206d495ba4 | |||
| 1292ff76b3 | |||
| 9f7177c67d | |||
| 8fd4bfc0e7 | |||
| 4428affc20 | |||
| 02405add76 | |||
| be6fbc76a1 | |||
| 32bf447644 | |||
| ecca81beba | |||
| 2e11485da4 | |||
| 9485d44903 | |||
| 64ad96e19e | |||
| a7cb13f339 | |||
| 6f06801f1d | |||
| 8d9021e806 | |||
| fb87b2d1ad | |||
| 28318f27d9 | |||
| b1cca43252 | |||
| 857976b29f | |||
| cbcc6ef9c4 | |||
| bac72ff0cc | |||
| 2470dc822f | |||
| 1eb68e9f9a | |||
| 301ee6c57a | |||
| d305f0a14b | |||
| fccfcfbe5f | |||
| 5f30e9fe1c | |||
| 80c8218d94 | |||
| bed2bfdc24 | |||
| 6f2967a8dc | |||
| f3f82f56bf | |||
| 9405a5e443 | |||
| f4f41d01bf | |||
| dfc906930c | |||
| 01825d883e | |||
| 65b1139d93 | |||
| dc18769010 | |||
| 9dd884a324 | |||
| becdac19ea | |||
| eaa64967b5 | |||
| fb2bfe1cef | |||
| cb5e6bfef6 | |||
| 30c299fd26 | |||
| ae06ee24c5 | |||
| fbc7a3775a | |||
| 78de32e552 | |||
| 661395a3b2 | |||
| 257ae51275 | |||
| 46eb12da51 | |||
| 4d544e35e3 | |||
| 95a5d63622 | |||
| ffbf7a9141 | |||
| a95a21a353 | |||
| 741e3c1280 | |||
| 9d43570ada | |||
| b356b44849 | |||
| 05c25b8cdb | |||
| eddce4182b | |||
| ef9ca61039 | |||
| 8c912d7ece | |||
| ff41bf5be8 | |||
| 2f537768bc | |||
| 68c010f82a | |||
| 4e4c3ef8fc | |||
| e4f60f82a4 | |||
| f58b923fd4 | |||
| cfdfd16779 | |||
| 636facf40d | |||
| b5fac1ac95 | |||
| 082fce5e3e | |||
| 2e0a1f1aff | |||
| f7f88b7187 | |||
| f04b2a9390 | |||
| 516fe131be | |||
| ee016e605c | |||
| 69d85cce2d | |||
| fe7f5ca7f4 | |||
| 9c7344487a | |||
| 5f9aac2027 | |||
| 43fc1bd21c | |||
| a981c33bad | |||
| 36ec7ab150 | |||
| 5301ec618b | |||
| a0a24e9380 | |||
| 40d789ce18 | |||
| 641bca87bc | |||
| 5ad473fc62 | |||
| 7aeb6b5200 | |||
| e250f6a275 | |||
| e59192b9ea | |||
| a1ee5124d3 | |||
| a280077820 | |||
| 13f3ccb85d | |||
| 770e539859 | |||
| 993f9f3efd | |||
| f3c7b61f29 | |||
| 3b8f83a5ae | |||
| 836c4e0198 | |||
| dfcccb63a1 | |||
| 6f5800bd74 | |||
| d3a2c6a0b4 | |||
| 7a8e3cc258 | |||
| e7f26cabfe | |||
| a29aefc9c0 | |||
| a73dce4a56 | |||
| f424da498a | |||
| 8b5e7429d7 | |||
| 5dfe28db2a | |||
| 949d2d9e50 | |||
| 0fe30d14a8 | |||
| 46f272b669 | |||
| c4620bb528 | |||
| 384e09aa7c | |||
| 54ad22a455 | |||
| 3bddbb1110 | |||
| 72e3d2492f | |||
| 51a61c5431 | |||
| 4e10f46899 | |||
| a729cdcfdd | |||
| a58276c4c1 | |||
| f075dd0db3 | |||
| 4d34d16bd8 | |||
| 57d0f0ce2e | |||
| 778b8a45e9 | |||
| 3c46a4062e | |||
| 2a7ba427dd | |||
| d87a71bd04 | |||
| 6bb10b1898 | |||
| f52351d116 | |||
| 7d72004742 | |||
| 09de17fb59 | |||
| 2c2984fd29 | |||
| d5143c2c15 | |||
| 59fd6428ae | |||
| 07c5a4fa04 | |||
| 550a806d77 | |||
| dc6c977766 | |||
| 86397df32d | |||
| 8e60b19662 | |||
| c508c2213e | |||
| 5d8727a59c | |||
| e8af38cc2d | |||
| b8cf818dac | |||
| bca4652c5e | |||
| 3c4308b7b6 | |||
| 464b2242e2 | |||
| 553487cc8a | |||
| 73f6426114 | |||
| 07cac80fb0 | |||
| 253ee0c407 | |||
| 2d1d628340 | |||
| c6c6c56186 | |||
| 528b9bd872 | |||
| 32dba5e0c7 | |||
| 58cc4b7043 | |||
| 795253a9d5 | |||
| 3cdf363cce | |||
| 63673d3ce0 | |||
| 2d8ee3a496 | |||
| 0561d5bea3 | |||
| cc5297d637 | |||
| 1595fdb54b | |||
| d705a5b45e | |||
| 0e9836649e | |||
| 4849d313fd | |||
| 3ec5cd312b | |||
| 138340ee99 | |||
| a5f0075a60 | |||
| 84c79d7531 | |||
| fd99ea09ec | |||
| 4e314ef6d4 | |||
| 776c1e66db | |||
| e0ed57db67 | |||
| 41eb5813e0 | |||
| 5fb3ee6101 | |||
| 3517fbdcbd | |||
| 7f56538602 | |||
| 4044ed8783 | |||
| a5d6f6ac98 | |||
| 41c55a30cd | |||
| 4a1d2d816c | |||
| 1e357b3c74 | |||
| f69da7d00d | |||
| 24a095c5c1 | |||
| 1742fb8655 | |||
| 76cc736755 | |||
| c35e271dba | |||
| 6ab7baa413 | |||
| 1114bdbb04 | |||
| f86423972f | |||
| 62f992af23 | |||
| 37e671612e | |||
| 3b3a3fa845 | |||
| 4cba40f9fd | |||
| 8048d1411f | |||
| 1a2cbe100c | |||
| 19320a1f8f | |||
| 7124326808 | |||
| ecd5ae890f | |||
| aa2601bb9e | |||
| 1879eede0d | |||
| facbbba789 | |||
| d61bc2d136 | |||
| 5ab220fa76 | |||
| b483a8d652 | |||
| ed14731146 | |||
| 746eae15f3 | |||
| 121b606f9c | |||
| 61af08d499 | |||
| a6105ef37f | |||
| 993609b5aa | |||
| e3116eed2e | |||
| 98d6c751d3 | |||
| 9165749321 | |||
| 75b790376d | |||
| 8da8bf7e87 | |||
| 8b6718c632 | |||
| 98b2b45264 | |||
| c4b69fcddd | |||
| a628559258 | |||
| 895e40190b | |||
| c442485137 | |||
| dd76a50683 | |||
| 9d0e82788a | |||
| d0d5003f45 | |||
| c2b72c0e73 | |||
| 9d0b6c5730 | |||
| 3229100025 | |||
| 0dde8f8968 | |||
| 235ba92602 | |||
| 6747d350a5 | |||
| 45c1432946 | |||
| 05b39623b0 | |||
| 62f37669dc | |||
| 600ef1e47c | |||
| 4d17613050 | |||
| bfdd1f4662 | |||
| be775ed72d | |||
| 8d083eb248 | |||
| 7573524a14 | |||
| 20d2061f22 | |||
| df297b6ca3 | |||
| 6175802693 | |||
| 0f23090545 | |||
| f43b250ed2 | |||
| 6e0b79a33b | |||
| 139c149486 | |||
| 3f7cd45df4 | |||
| c298095000 | |||
| d30b5481f5 | |||
| f587a4e3f3 | |||
| 3b73b115ca | |||
| 71e789943e | |||
| 1caf8a1f5b | |||
| 1d3f28da2e | |||
| 86ba0cde35 | |||
| a335cf2edf | |||
| 33ccf1b931 | |||
| ccdbffbf3f | |||
| 8f509b0ae0 | |||
| 001c77d1f7 | |||
| c45b91aa94 | |||
| 5d0e6c21aa | |||
| 5991836e1f | |||
| 532df198da | |||
| 241d2e3fa3 | |||
| c55d53daa6 | |||
| 8a67846872 | |||
| 704b8cd83c | |||
| 84b961cb20 | |||
| 8bf6b190ff | |||
| 69c6ffa90b | |||
| e989bf3b0e | |||
| cfdeab70cd | |||
| de1161536b | |||
| 589bb921ae | |||
| b59a4331fa | |||
| 832059967c | |||
| 30e7e2c276 | |||
| 3ae892bf91 | |||
| 930752d46e | |||
| d172c71376 | |||
| fd8207dd9a | |||
| e7596d92c7 | |||
| 3ced55aa93 | |||
| 2d2291d00e | |||
| da4b6896f7 | |||
| 8fca37f373 | |||
| 155dea6f14 | |||
| e5ff55a1be | |||
| 07c24e72ac | |||
| a8ea6e6463 | |||
| 58f0330d3f | |||
| f7aaa2e1c7 | |||
| cfa6c7d45b | |||
| df1ef496d1 | |||
| dd92c8e927 | |||
| 10c14bcc05 | |||
| eee726ec7d | |||
| 22fc59ab59 | |||
| 50a6ffa952 | |||
| 2b621eb45d | |||
| c44ff3eb3d | |||
| 3e7d830f57 | |||
| 26db51fa9d | |||
| fb9502e0fb | |||
| d0ea2b2867 | |||
| 5573d98ecc | |||
| 38b44e3fc9 | |||
| d4ab2024f5 | |||
| 790bba1556 | |||
| b51aed8aa5 | |||
| 1f52112d72 | |||
| ad907a51e2 | |||
| 6673359d89 | |||
| 560448afed | |||
| deaefbf1dc | |||
| 9823a37362 | |||
| 15bda88d04 | |||
| de73b9b934 | |||
| 2fc854eda0 | |||
| 60607ed18d | |||
| 546e56ef3d | |||
| dc78e0a250 | |||
| 5ffa6f3331 | |||
| 1a23ffd776 | |||
| c07f99d5e4 | |||
| ae8be31247 | |||
| 4f6910c131 | |||
| d787cd3076 | |||
| cc3e878f90 | |||
| b9b9a3115a | |||
| 36d3b6aa95 | |||
| 911cd1a6d3 | |||
| da84b59ee4 | |||
| 11343bb0ea | |||
| 3107d8a0f4 | |||
| 7f1fa0d1ff | |||
| 604c5dedf4 | |||
| 71f2617263 | |||
| 8532c2b9b6 | |||
| 1affbe2100 | |||
| 9dc2712c47 | |||
| 6e1024737d | |||
| 03a41021de | |||
| a73cff8e4f | |||
| 8857fc6c4b | |||
| f671e6d138 | |||
| 4d6ebf95fc | |||
| 8c512191b2 | |||
| f147a8990a | |||
| 048f6b4731 | |||
| 9cba3c87ef | |||
| dbd28eecc9 | |||
| 2c62886c71 | |||
| fe0b770033 | |||
| b75e682c50 | |||
| bb6d718e19 | |||
| 28a136d7f4 | |||
| 10ec5c7f34 | |||
| 55c31fbe9a | |||
| 2f1fd4bbaa | |||
| 18a10c0db1 | |||
| aad0f517b4 | |||
| 1b9ff68f8c | |||
| aa054471f2 | |||
| f2ff75f3a2 | |||
| 5dc8f5cfab | |||
| ced1bb9404 | |||
| 9f14127fd6 | |||
| b95e548ddb | |||
| 87bef13a4c | |||
| 72cc5a49e6 | |||
| a94fa7b476 | |||
| 43b712d42b | |||
| 2c5967925f | |||
| 4182cf3e9e | |||
| a1796ecace | |||
| 3eb8e26174 | |||
| d05bf563a2 | |||
| 3ea56ba4c7 | |||
| f56929d0df | |||
| 101f09aabd | |||
| a0d312396a | |||
| 6903a2ffc5 | |||
| 8dee12ff05 | |||
| 9299f4e98a | |||
| 6225870aa9 | |||
| dad486c01b | |||
| 0b7e857614 | |||
| 431f6bf3a5 | |||
| 9372aa99af | |||
| 81c29ecc7e | |||
| dd388aedfd | |||
| a46e025725 | |||
| fd270ddc6c | |||
| 369ffe518d | |||
| 0afa4cc957 | |||
| 872f031405 | |||
| 35791c6371 | |||
| 137f70b122 | |||
| dfa33082bb | |||
| b2bc85f6f6 | |||
| 21372c3d4e | |||
| 7ee9aefed7 | |||
| 8c9a59c29e | |||
| 28404f9e87 | |||
| e66e51fa6d | |||
| 2b9842e094 | |||
| f52cba6aff | |||
| 713de872ce | |||
| 1aa421efe5 | |||
| dd42831cba | |||
| f0b662ff58 | |||
| e8ca077f30 | |||
| 2328f8b9b8 | |||
| 680172a084 | |||
| 254b25296b | |||
| 903d0b91fc | |||
| 54ccfcc705 | |||
| dfacd260bb | |||
| 04b83d50a2 | |||
| 1236585693 | |||
| c76008bd6a | |||
| e0aa9ce372 | |||
| ee7701c15b | |||
| 6e1c133e33 | |||
| 969268166e | |||
| 83a156ef47 | |||
| 6136959a6a | |||
| 4f840c211c | |||
| db5967472b | |||
| e65a84f6ea | |||
| 526924559f | |||
| 24623d398c | |||
| 56462cf082 | |||
| f384f81253 | |||
| 427b5d61f4 | |||
| e27fba0c06 | |||
| 7a1ec78563 | |||
| ec42be346d | |||
| ccf990a0d7 | |||
| fd77251fdd | |||
| f7d9305786 | |||
| bcda46e3f3 | |||
| 7fc75fc482 | |||
| 45fff07a4c | |||
| 08d54b3d78 | |||
| 735c1b6183 | |||
| bb1039d4c9 | |||
| a21d4c06ae | |||
| 12468f5e9f | |||
| 468e437390 | |||
| d167af4c38 | |||
| 3061a31c92 | |||
| 73e354b7a0 | |||
| 0cc03f912c | |||
| f003e52009 | |||
| 13c4eef637 | |||
| d5b06624fb | |||
| a3a10b62f2 | |||
| 03160719eb | |||
| b276a7fd17 | |||
| 37e2250992 | |||
| bdb8c07bb2 | |||
| 27f9437d31 | |||
| ba301fd800 | |||
| 53d7ae4e9b | |||
| 7a027be255 | |||
| ece06c26a9 | |||
| 8d28853774 | |||
| fb8b421aac | |||
| b3ecede429 | |||
| b8d7925d0d | |||
| 95e0ed2826 | |||
| 11e11b8767 | |||
| a4c73860a1 | |||
| 241297b6d6 | |||
| 65e24f812f | |||
| fd455be55c | |||
| 7e172bf456 | |||
| a211dc03b3 | |||
| 490d4a504a | |||
| c076a7f7a2 | |||
| 7b23f41fd4 | |||
| f2b9becd7e | |||
| f298cde47e | |||
| 28fa18874b | |||
| e699f9cbf6 | |||
| 31a434b9d7 | |||
| d86910ce94 | |||
| 79ee2fa20a | |||
| 9e0fc44210 | |||
| 35e9c131d6 | |||
| e27a2a96a0 | |||
| 29fa369f71 | |||
| db82a25177 | |||
| b2f77bb050 | |||
| d9e79fd728 | |||
| 52e8d8db54 | |||
| cbf325a6b8 | |||
| 8fd88eee2b | |||
| 98a27bff0d | |||
| 00985cffea | |||
| 0fe1051101 | |||
| fd2477923c | |||
| d4fb372899 | |||
| ce1ec22704 | |||
| 03789c4d97 | |||
| e0ca244623 | |||
| 3c41f108df | |||
| 7069d03ab2 | |||
| 01215f5015 | |||
| 42d00b13df | |||
| 1f21a499d4 | |||
| 274c729fd3 | |||
| 9d24ee8daf | |||
| dd5e0f724a | |||
| 653d73ff07 | |||
| 662d81c801 | |||
| 187602dfaf | |||
| 8707ae23e2 | |||
| 0127763ade | |||
| e7c711996b | |||
| 1e726fe405 | |||
| 24e18a9fbd | |||
| 5f824c5708 | |||
| 57e4b82b66 | |||
| 6dcb77f7b5 | |||
| 42761acf4f | |||
| 01756b6b02 | |||
| b35bfeb1c3 | |||
| af4e8b171c | |||
| 5233e66762 | |||
| 52c246ae19 | |||
| e34f279295 | |||
| ee66d9ccf9 | |||
| 1c19af2c8f | |||
| 10aaab6350 | |||
| 62f060a389 | |||
| 004bed8a7f | |||
| a971233068 | |||
| 67ae845b3c | |||
| 708ea3d0bb | |||
| 49564e5310 | |||
| 604afd52d1 | |||
| 6dac71e618 | |||
| d58bbd5da1 | |||
| 68299c6a5e | |||
| d079634c5e | |||
| 9025c63c43 | |||
| c6ef86029c | |||
| e3deb6e9a5 | |||
| 6eec242a07 | |||
| 28b8bf566b | |||
| 0ce3f6efe0 | |||
| 617f5dfe5e | |||
| 1f12273de1 | |||
| 65483dcc95 | |||
| 32d859eede | |||
| c74f972627 | |||
| 33c78d2bb2 | |||
| 7626ef57b9 | |||
| 07b4cc145b | |||
| 27366197f3 | |||
| d49969ddf3 | |||
| c91a91008c | |||
| 92b4c05090 | |||
| d45ad8f827 | |||
| fa3bd72eea | |||
| d3068125c5 | |||
| e269e936e3 | |||
| 0d2645b3e1 | |||
| 9d0e64a725 | |||
| 9e004a9496 | |||
| 5ac08a44c6 | |||
| c72b1c5893 | |||
| c65bf64756 | |||
| 7201433060 | |||
| 7bbdbcfb6d | |||
| 3f01b222b2 | |||
| c929fb52dd | |||
| 11b407045a | |||
| 811bb7997c | |||
| d932cd9be1 | |||
| 5e5dfff6fe | |||
| 107f692de8 | |||
| a1019413f4 | |||
| b95f5c5bea | |||
| 8c0cb6cce8 | |||
| ee93101b24 | |||
| 7f4c5b86db | |||
| 9bf33e4dcd | |||
| 876c2586b9 | |||
| b9ed139546 | |||
| 85d61de61c | |||
| b8186b5081 | |||
| fb67b9bdad | |||
| 2c983d6c7a | |||
| 7c28d6b869 | |||
| 53035de136 | |||
| d7ca3ea27c | |||
| c12be1f98c | |||
| 90be1c3fa7 | |||
| 727bf7dd8c | |||
| e9425d711d | |||
| 9d42beb2e6 | |||
| ea8d682664 | |||
| 8f7bac4999 | |||
| 3921369f98 | |||
| a243996aca | |||
| 0f612d5021 | |||
| 14567f3459 | |||
| a54154e760 | |||
| ac10fdc50f | |||
| 90c0194598 | |||
| 09d07f76b3 | |||
| d33fe2378c | |||
| 7b9f7d8aba | |||
| 0681b8096c | |||
| d879853e8f | |||
| 0a279cf666 | |||
| c0870d417a | |||
| ac82dc418a | |||
| 144272e735 | |||
| d62aa6221b | |||
| 68abaeab19 | |||
| 00bc094914 | |||
| 84a47a6691 | |||
| 03b53ffde1 | |||
| ef14b18f8e | |||
| 3f90ecfd77 | |||
| a275e4e5b8 | |||
| fd45854000 | |||
| a10626705d | |||
| 0cbc44d8bf | |||
| 5c93b49a6f | |||
| df238fe6a0 | |||
| f1d4713097 | |||
| d0f953218f | |||
| fda9fb563b | |||
| 49b5e1d9bf | |||
| eb84acaf5b | |||
| e9364c7cba | |||
| 08f392cdd3 | |||
| bb597dcf66 | |||
| fec58157ac | |||
| 6be8ffb771 | |||
| 1b19eed195 | |||
| fb41413b76 | |||
| 40c8f2001d | |||
| b41f41589a | |||
| 69a6d26c80 | |||
| 0fef29b6e3 | |||
| f7e2467da1 | |||
| dc44edc1b8 | |||
| ca53d88284 | |||
| 5e46f63e17 | |||
| 43a91e5963 | |||
| 1d5862a39b | |||
| 7c786506e1 | |||
| d03c3980de | |||
| 9bbe9455cf | |||
| 6376b683c7 | |||
| 9dba7cd371 | |||
| 49e252df03 | |||
| 8049db20ff | |||
| ecf5f5d21d | |||
| 12a39450b0 | |||
| c753fc690f | |||
| 35c1b330ec | |||
| a88ae2080c | |||
| e8aa6ab735 | |||
| f2726399dd | |||
| d47e694048 | |||
| 44c57ab05a | |||
| 4a89731025 | |||
| 2b928b4754 | |||
| 923ca6f104 | |||
| 4472ba2b6b | |||
| 7f3dcb3e8a | |||
| a26f2fb00b | |||
| 8ff87c120a | |||
| 4327b5c1b0 | |||
| d6de6de1bb | |||
| 9eecb2f542 | |||
| 54debf855c | |||
| acda53aa1c | |||
| 71921bc9b2 | |||
| bc5c52dc95 | |||
| cf1f8aff77 | |||
| d78f2926ec | |||
| 46916d322e | |||
| 299f849ffa | |||
| bbf06152da | |||
| 8ffae97128 | |||
| d4ac8bc67b | |||
| 8e1637a2cc | |||
| 4e8d92bece | |||
| 4eedeabb51 | |||
| 3009707723 | |||
| 8edcf03715 | |||
| abea8ff8f4 | |||
| 3dd1fe4211 | |||
| d2969d2326 | |||
| e3831c146d | |||
| 218de578e0 | |||
| 87fbda8344 | |||
| e9ab6c10cf | |||
| 1eb592550c | |||
| dc3cfd0d9d | |||
| 2f17f2207a | |||
| d2e1e9a0ac | |||
| c0a3931595 | |||
| 55d1938977 | |||
| 3a99d001ff | |||
| 7033003c36 | |||
| 21c7e699f1 | |||
| 208200a3cc | |||
| ba2cadb479 | |||
| ca47dffa35 | |||
| 548d5603ea | |||
| 6b458676b1 | |||
| 63448f3244 | |||
| 2d88bcb67e | |||
| effc37362a | |||
| 3ba80d11eb | |||
| edea49f9a9 | |||
| 1d63fe6542 | |||
| 87d32647f1 | |||
| 56a5d0b287 | |||
| f86765a760 | |||
| 3efbd45443 | |||
| a87e5197cf | |||
| 5b33afb1dd | |||
| b0585e13d8 | |||
| e685950d97 | |||
| 5eaa10e2ad | |||
| 9f53738339 | |||
| b9d9e74f2c | |||
| 4402a0578a | |||
| 815c636449 | |||
| c840bbc970 | |||
| b530db948e | |||
| a9d18f0f57 | |||
| 811b5f8bc3 | |||
| 4ad633bae2 | |||
| 41e4124af9 | |||
| 84ab088b40 | |||
| d6a56b882f | |||
| 624bf10ab5 | |||
| 90a2b482e6 | |||
| aff4fccfc3 | |||
| aa4119a849 | |||
| a8c361c93b | |||
| a3fac744c7 | |||
| 9eaa69874a | |||
| 28a3d95cda | |||
| 185e31d322 | |||
| 2ce9fa4b9c | |||
| cfcfc8047a | |||
| 91c350e793 | |||
| 84a1fff302 | |||
| e83b7edefc | |||
| 81d7bd8f41 | |||
| 31af49e507 | |||
| 45996fd20a | |||
| f423edd938 | |||
| d00c89946d | |||
| 198b3ae0f8 | |||
| 719404803b | |||
| 331ca6a800 | |||
| e2480d40d1 | |||
| 4b860f1092 | |||
| 1fc0dcdc97 | |||
| 820cc69d0a | |||
| 20073246bb | |||
| 57e94fb838 | |||
| e6c15eee45 | |||
| f0c29afe21 | |||
| 4d6b6bcffc | |||
| f8c6de0cdc | |||
| 9a60f7a793 | |||
| 844a8c7074 | |||
| 2d88a2cfb7 | |||
| 59de35e749 | |||
| 2844086772 | |||
| 2be027f92e | |||
| 34d9cb6778 | |||
| 6af6a35d9d | |||
| 6ec4e744c0 | |||
| c87c354403 | |||
| 56fac55a39 | |||
| de9c0eda36 | |||
| c559fc8227 | |||
| cfad5cb435 | |||
| 0b3b4da7d0 | |||
| a0c8d348a0 | |||
| 08dcd1f680 | |||
| 91730d71ff | |||
| 5e3be83dbb | |||
| c1b900aae9 | |||
| 094e822070 | |||
| 82540be931 | |||
| 36aff1e464 | |||
| ba1176108a | |||
| 9b3e16cdd0 | |||
| 34b6bca006 | |||
| 6429be6efc | |||
| ba16c53218 | |||
| 0d95f67f2e | |||
| 3ec59b36eb | |||
| c7ecfe28e7 | |||
| 7afd274d0c | |||
| 71bec0824c | |||
| 4764e2c544 | |||
| 777c50a1ec | |||
| d8687512b1 | |||
| 62cc65cafe | |||
| 0a99f8feed | |||
| 6dfcd491d0 | |||
| 2963229dfa | |||
| 7a168205eb | |||
| 9a8f8f8284 | |||
| 57f4d0523e | |||
| 45b11553f4 | |||
| e5d0b27aaf | |||
| a33ae10c56 | |||
| 017d97fd0e | |||
| b167cd2427 | |||
| fae3c860a1 | |||
| e9677594ea | |||
| 7b9ff164cc | |||
| 978d93af88 | |||
| 31337826a3 | |||
| fbcc07261d | |||
| 20b3af1cc2 | |||
| 6d47baee5d | |||
| c6dcf9d006 | |||
| f934b774a1 | |||
| e6fdf530b8 | |||
| 1c4f125cb0 | |||
| 3f93b8baed | |||
| 637123f340 | |||
| 7243ea549d | |||
| 686bb056a4 | |||
| 1be16e3d8c | |||
| 69999f962a | |||
| 5a6fc3e5b7 | |||
| 7be57ff9f0 | |||
| 81a0206df8 | |||
| 80bde7b6b5 | |||
| e349a44c60 | |||
| fbefe55102 | |||
| dee475cee1 | |||
| 9fd358f10c | |||
| 8c05053951 | |||
| b0392be4bf | |||
| c824086825 | |||
| 1a9644cef9 | |||
| 8723440d1d | |||
| ea9b4dc82c | |||
| 2eab920935 | |||
| 087a6fea13 | |||
| 9c9113e225 | |||
| 8f008ac75d | |||
| 8a4f8e72df | |||
| 43222d5879 | |||
| 04a3bd0d34 | |||
| af70e80816 | |||
| 22de37ad50 | |||
| 6cf4b888e1 | |||
| 6557751199 | |||
| 6e4925e6b6 | |||
| 3404cb1fc4 | |||
| f3bddc4e4e | |||
| 3e68e4b418 | |||
| edb2a83e71 | |||
| 2a4f8acd62 | |||
| 885b0d2ec5 | |||
| 66834cf324 | |||
| 9ead6a30f2 | |||
| af20db4512 | |||
| fee375f31f | |||
| 182fdd95c3 | |||
| 7f20184ebc | |||
| b04914fb72 | |||
| 2ecb4fad72 | |||
| ee4c2b36b8 | |||
| 00143f77d0 | |||
| 1a04c8c7bb | |||
| 6f4589b375 | |||
| 139a33c9fc | |||
| a3f6e48eb6 | |||
| a8dffdebd4 | |||
| 889695b6ba | |||
| bf4c08bce1 | |||
| 9e68c9a214 | |||
| 7a6b742d12 | |||
| 2dbd2063f8 | |||
| e8ed880e62 | |||
| 2c8f566231 | |||
| 21ee7b1c86 | |||
| 5fdd949115 | |||
| 0a03ef4b6f | |||
| 71db4f0426 | |||
| 465840e1fb | |||
| d17db47775 | |||
| 517bcd2b5d | |||
| 3eddbc7286 | |||
| a1f319d5b6 | |||
| 31352f8a8a | |||
| 2878876064 | |||
| 7bf04d1526 | |||
| a4d6908d55 | |||
| a4618309ce | |||
| 257dc6d173 | |||
| 753cf994b6 | |||
| c353eab898 | |||
| 7226f6834e | |||
| 2e010909ac | |||
| 0d080cea83 | |||
| 6f4381df53 | |||
| db8fb9a03a | |||
| 87ede6fa1b | |||
| fd35d1b8a6 | |||
| 8fd8772a6f | |||
| 0f9ac3026d | |||
| df0a0c9490 | |||
| f2b9be6e70 | |||
| 39abda8743 | |||
| dcb101224f | |||
| e7e1dcf190 | |||
| d466ac12ea | |||
| 1c7f53bbb2 | |||
| 0acd751e2d | |||
| bab660ca7d | |||
| 109f68f7df | |||
| 819ec462b8 | |||
| b6a32500c4 | |||
| c61a311c0d | |||
| 5cae4e9f55 | |||
| 58ac815822 | |||
| 3ba374a29e | |||
| 7ce675e604 | |||
| aa2ced96e0 | |||
| 8c59212ca4 | |||
| 4f4843a845 | |||
| 3a396a25dc | |||
| 18853defdd | |||
| 649965ae32 | |||
| afe5027a39 | |||
| 04c4c6004e | |||
| 2693e35cae | |||
| e38abef720 | |||
| 0eae28a663 | |||
| b28b2ca266 | |||
| 296a2ad7e4 | |||
| e9431b5445 | |||
| 4258ff1a68 | |||
| ef12425bef | |||
| 62680bb356 | |||
| 94fea59e9d | |||
| a4e1132048 | |||
| 58eaad703a | |||
| 6f272e13c5 | |||
| 9dedd121bf | |||
| 315cb6d001 | |||
| 48b0abc3a8 | |||
| d8a3b9eb3a | |||
| 60e8c7afb2 | |||
| e19c016c74 | |||
| 89b56ca5c2 | |||
| ca83e1a26f | |||
| 7a04df47f2 | |||
| 8db72d027e | |||
| 6851909f90 | |||
| 7e902b7e29 | |||
| f8e83f79c5 | |||
| 615bf2a6f1 | |||
| 474be6058b | |||
| fb3f6a46c1 | |||
| b3bd47b4b2 | |||
| 28e315cd69 | |||
| 0e3d86579b | |||
| a26a21d19a | |||
| d8557547dd | |||
| fe88fb7ed9 | |||
| 19d0c985be | |||
| 4a0fc4d699 | |||
| 931df1231a | |||
| b51c6d4737 | |||
| 3893114c86 | |||
| fcc29fc189 | |||
| d7aea9608e | |||
| 4c5a58a5db | |||
| c059ea0ea0 | |||
| 6a8ac21f80 | |||
| 08c5557026 | |||
| cb2ec628df | |||
| acdfbbeb86 | |||
| 8b72cbebde | |||
| 41529b6598 | |||
| 11b811820f | |||
| 39305aa47c | |||
| caeac3851a | |||
| 04a3ece3e0 | |||
| f1cdd02d4c | |||
| c1920f31ca | |||
| ecd8227de0 | |||
| 5768ee0f9e | |||
| 50a77ef7f0 | |||
| 75924edcf8 | |||
| 1cceae89cd | |||
| 26ac992242 | |||
| 8c4a06d855 | |||
| 51a1561ae9 | |||
| a15ab85557 | |||
| 9b2e810bdf | |||
| b57ca6e4ac | |||
| 7930fd9ce8 | |||
| 9767e59e6c | |||
| c12e6933f5 | |||
| 59d2871b59 | |||
| 4dd2496530 | |||
| 110e0d782f | |||
| e955dce3dc | |||
| 101d57d093 | |||
| ea371618da | |||
| cab83ba840 | |||
| 8d20a83e09 | |||
| c5e411f492 | |||
| 189306d24e | |||
| f9e54331ba | |||
| a97a1ae218 | |||
| a6ff61d52e | |||
| c710b6e06c | |||
| 1d43e81be0 | |||
| ddc997c81f | |||
| 988fc202e2 | |||
| 6aea00289c | |||
| fbc2d2d726 | |||
| 1b0a5abd73 | |||
| 99c377b4e4 | |||
| 288eb06708 | |||
| eb3d6a5333 | |||
| 37b56e09a3 | |||
| 0cccc60409 | |||
| 2282801172 | |||
| f4e9f3654e | |||
| 40d442fde2 | |||
| 6ccb4b93b1 | |||
| ddc23c6224 | |||
| 7216b8f804 | |||
| bd6e60f56d | |||
| 5b9aeb2e5f | |||
| 0465e0ae3a | |||
| 3b68e44d9a | |||
| d4ba94479b | |||
| 87ce545e15 | |||
| f8ee6f8b31 | |||
| f15fef90a9 | |||
| 53e79224fc | |||
| 2abb674c87 | |||
| 60aadd2a02 | |||
| 6ce1eeb4ae | |||
| a70fdfaeba | |||
| f17394d677 | |||
| 12ba2ad77e | |||
| 59eca253e1 | |||
| 4ace02f4c2 | |||
| c753d2b7f4 | |||
| d5fdc75c82 | |||
| 3c318d0dc7 | |||
| 5013fdaf79 | |||
| 06bf3ccfb7 | |||
| dcb0f5dc3b | |||
| 18fb4b1ce1 | |||
| 45116128e8 | |||
| 7beebcd315 | |||
| 883347bc11 | |||
| b5ef699523 | |||
| 2da25d67e1 | |||
| 6954772ece | |||
| 2fdeceda58 | |||
| 53cc8a0d6e | |||
| 10fd9ed896 | |||
| bb7dbceb5c | |||
| a439892d7a | |||
| bd872d5dcf | |||
| bdfedf249a | |||
| 4785b04aa1 | |||
| 8c052e43f1 | |||
| 85d094bbb4 | |||
| 97d7af7a23 | |||
| 0a64f197d9 | |||
| af75e24c2e | |||
| 78e10d346a | |||
| c574bcce88 | |||
| ce90447531 | |||
| f924344cc5 | |||
| 323b3a63d6 | |||
| 077b9201ef | |||
| 1f6612dfc4 | |||
| c43ca39ec2 | |||
| 0407828027 | |||
| a1cce36c1e | |||
| 4fe1adc383 | |||
| 2a78fe0f81 | |||
| ea5886c77d | |||
| e9053654a7 | |||
| 0be276482e | |||
| 7e55cbf798 | |||
| f131f58124 | |||
| 5a4a6285bb | |||
| e7ebb66200 | |||
| 5deca5a18f | |||
| 05033bb9d6 | |||
| 83097657d5 | |||
| 12e8861a1c | |||
| 22bf2b49c6 | |||
| 4a39c8cd53 | |||
| c05beb74a9 | |||
| cd89fa141b | |||
| 76f4dd34e0 | |||
| da60dcbf2e | |||
| 368a581de9 | |||
| 24c5259005 | |||
| 2110739138 | |||
| a4a487b0cc | |||
| 6071a0835a | |||
| a272c019f9 | |||
| dde86a4179 | |||
| f8d57370d0 | |||
| de315c97b1 | |||
| 1247f73754 | |||
| 50ba20fe1f | |||
| b6856dcb99 | |||
| 54ec6a0ce2 | |||
| dca7c5d1ad | |||
| 7473241438 | |||
| be0c9ff705 | |||
| 3f644b6275 | |||
| 838220e4b3 | |||
| 18a5000718 | |||
| 21674b2879 | |||
| 12dec2563a | |||
| 603e4d66ac | |||
| 90fcb82a3e | |||
| 94a6844521 | |||
| bdb3f1ae2f | |||
| e3f1f7cd85 | |||
| c0b4f4eb47 | |||
| 68ef3ac675 | |||
| 2cae26ee35 | |||
| 83aa3dbfa6 | |||
| 82ac8a1e76 | |||
| c60696dbae | |||
| 75b0e3246a | |||
| a74e82fbae | |||
| 8cf672104e | |||
| 8bdde8d7a0 | |||
| c4f3f67537 | |||
| ec23e37a4a | |||
| 00fbe50bbe | |||
| 2e48d6cf70 | |||
| ec04517710 | |||
| 8cc0369d97 | |||
| f7cdc05937 | |||
| ea0afd0b4d | |||
| 62ba799d72 | |||
| b6508c4bd1 | |||
| 853d01de68 | |||
| 311b65b225 | |||
| b632b52b11 | |||
| 9630c2683c | |||
| f53d5a0872 | |||
| 5917b5cf5c | |||
| 2a6d48bf9e | |||
| 0967c87a8f | |||
| 0ffee29a11 | |||
| c75e98dc84 | |||
| c7f7f2403d | |||
| 4533a197d5 | |||
| 1ed853f5d6 | |||
| f83bbce3a3 | |||
| 4fccb92e07 | |||
| ec596315bd | |||
| 9aee6674bb | |||
| 7d64de646a | |||
| 1e4691f02a | |||
| 4fe4fb0585 | |||
| cf74248949 | |||
| 072f996af7 | |||
| 1f7c085527 | |||
| a596969049 | |||
| 11badea962 | |||
| d04ec15849 | |||
| 69d55cabd4 | |||
| 9baa944460 | |||
| 92767f5513 | |||
| b320b1a3c2 | |||
| 35b9e9b4a5 | |||
| 21ce39aa9b | |||
| ea80b2c8fc | |||
| f501930728 | |||
| 8285953c1b | |||
| 6375829448 | |||
| b0f0dc683d | |||
| c2802d35bb | |||
| 2693d0eb27 | |||
| 6fed11896b | |||
| 178721a329 | |||
| 263f29a96a | |||
| e99f967372 | |||
| 313efa33ae | |||
| eaf6777a66 | |||
| 0f6fc48f85 | |||
| 1e13a7161a | |||
| 3ed0b24831 | |||
| 050ba0e0a0 | |||
| 418b3e5ee2 | |||
| aa901ac4a2 | |||
| 0b80841c38 | |||
| e370834c35 | |||
| 9b9cd698a5 | |||
| a4b89e67c6 | |||
| 814db9d7c9 | |||
| 7f83231385 | |||
| 5247bb11f7 | |||
| 763544585a | |||
| 8a885dc61b | |||
| f74b5a6b9b | |||
| 72e3238c3f | |||
| f86c6851fc | |||
| f6ffbe548c | |||
| 04c27573d6 | |||
| 9a23fb5863 | |||
| 90d364fc37 | |||
| 79d51581ba | |||
| 9507c49b18 | |||
| 87b07d6f2f | |||
| 64711e0d56 | |||
| bf33b2f862 | |||
| 54315252c7 | |||
| 733eb127e9 | |||
| 2132efa981 | |||
| da79674f84 | |||
| ae36ed3903 | |||
| cc4db8e4a9 | |||
| f9f8fd37de | |||
| 193c0a52d9 | |||
| f5139f8bf4 | |||
| c0920bbf6a | |||
| bcf65aa503 | |||
| a866a758cc | |||
| e7838c5f79 | |||
| f21b91f1a7 | |||
| edda32e6b4 | |||
| 639b0b8f50 | |||
| 18dd0d00a6 | |||
| 24fd19259d | |||
| bdd555990b | |||
| c762b7c91b | |||
| 45731bd022 | |||
| 492ba2a111 | |||
| 349465b168 | |||
| 98427ea92a | |||
| a90edd5eb4 | |||
| 6fdaaf3d20 | |||
| 406f8363bc | |||
| 8e03a4cb93 | |||
| 1403260487 | |||
| 6831341ab4 | |||
| 0988af453c | |||
| 631457ffea | |||
| bec1844954 | |||
| e6d0a8ef66 | |||
| 70ab146cbb | |||
| 33b2e12886 | |||
| 1de29026d5 | |||
| 854af7a4bf | |||
| f72c559824 | |||
| 321afd5fef | |||
| 91df2bea80 | |||
| 5de2946999 | |||
| c650b752f1 | |||
| c12f41ec6f | |||
| 2c6ec0c999 | |||
| f1e563d8cf | |||
| 6de179eb7d | |||
| 584ffc6f52 | |||
| 2c99c1e06f | |||
| f95a2f6d91 | |||
| b31e358270 | |||
| 673835e5d9 | |||
| f5bae208cc | |||
| c25c31b1de | |||
| 343441d746 | |||
| 78fc4c8947 | |||
| 86165ceca5 | |||
| 8989353fab | |||
| 7e0524109e | |||
| d88e694d06 | |||
| 44d50c2bd3 | |||
| 58548f5051 | |||
| 782eabc226 | |||
| 0ff3ae3cc6 | |||
| 8088c7dcd5 | |||
| 604d10d307 | |||
| 8dcc72ce9c | |||
| d06bcd6dd3 | |||
| b3c2ee56f9 | |||
| 435e98ceed | |||
| 7d21dfc938 | |||
| 2e1ba73926 | |||
| e8a62ee3cf | |||
| 4e8eea8e78 | |||
| d83baf8925 | |||
| 348570fd68 | |||
| cf61562196 | |||
| d02d7a95d1 | |||
| ba07c26761 | |||
| e56295851f | |||
| f7d93dadeb | |||
| 5c87762f9e | |||
| ea78514ff3 | |||
| 2616feb3df | |||
| f4255b14e8 | |||
| 41774ec9de | |||
| 60155aa442 | |||
| 169ec65e72 | |||
| 660420050b | |||
| 0ddb4d88a9 | |||
| 9142f5446a | |||
| 6d4c82f4d8 | |||
| 4424645e04 | |||
| 05517e2096 | |||
| be7bbadabe | |||
| d4a5b10133 | |||
| 4584a52ba5 | |||
| 27bdf4b24e | |||
| c2c6a679ea | |||
| 1c372df449 | |||
| 3a91ab4706 | |||
| 303d871ca7 | |||
| 00c09e95ac | |||
| f3de0f6c53 | |||
| 7415e4e66d | |||
| 6572d7131f | |||
| d9d920e0b3 | |||
| cd5735130d | |||
| 3245a5fdf6 | |||
| 37cf156223 | |||
| d2741c8680 | |||
| dd118e2f36 | |||
| 4975e93350 | |||
| 82e602c847 | |||
| 88d7f4d7be | |||
| 5cf2cf2be9 | |||
| a7f5d38da7 | |||
| ec4a0a3e0d | |||
| 97e0d55073 | |||
| 7efd740950 | |||
| 61d96ce1c9 | |||
| f902e208a3 | |||
| 178a1da165 | |||
| 7ce91c5ffe | |||
| 23faf902ab | |||
| da6c8317a7 | |||
| 6bb6f7f288 | |||
| b3223d7b41 | |||
| 568f292883 | |||
| 4b928b2da8 | |||
| 928d874dea | |||
| ecc8013812 | |||
| 6634bedb25 | |||
| e3d4e328f9 | |||
| 93421f3a00 | |||
| 023cb54fae | |||
| 90bc1993b6 | |||
| 362145f608 | |||
| 5d0429ee2a | |||
| 5f5f76956f | |||
| fd8cd31504 | |||
| a87c517da5 | |||
| d051c2adbd | |||
| 63e7ae793b | |||
| 79dc8a2297 | |||
| 225487f9db | |||
| 47aa61c0ec | |||
| 1bfc51ad5c | |||
| fb48cd0ab4 | |||
| 0251eb85b2 | |||
| d8ed749045 | |||
| 77b06dce0c | |||
| 4f73ac7289 | |||
| 60ab7a1ddb | |||
| 76d8d1742c | |||
| 8e0fac897b | |||
| 0c7035d8a3 | |||
| b5e4511de8 | |||
| 98bcb25fd4 | |||
| af8f9f790a | |||
| 9fd06fa767 | |||
| 4696142a31 | |||
| 435e1535cc | |||
| 4628f0e237 | |||
| e65deacabb | |||
| 55ba5044ef | |||
| 648269e0ec | |||
| 5b56d6698a | |||
| 62206c0386 | |||
| da1a60aeb6 | |||
| 3eaa19fdb0 | |||
| c539254101 | |||
| 24d8daa01b | |||
| 073b7f1e3a | |||
| 5926bacea1 | |||
| c5204807e9 | |||
| 9d5a9621de | |||
| 9cf8537051 | |||
| 56ed55ddba | |||
| 217bae9ff1 | |||
| 250bfac0cc | |||
| 57a87a278b | |||
| 0b7d69d06f | |||
| 79d4123319 | |||
| 648e7f73a5 | |||
| 941b890881 | |||
| 0f9eb480aa | |||
| 0473f7ee58 | |||
| 3a89d34e7f | |||
| cd85fa3abe | |||
| 979876e958 | |||
| cf8316bfbb | |||
| 49ca16c3fb | |||
| d93471fdad | |||
| 872516f9f9 | |||
| 7c7e663911 | |||
| c04d5624da | |||
| d07ce9ef21 | |||
| dcf3587d9a | |||
| 94244c1d93 | |||
| ed39317203 | |||
| 1917ed8741 | |||
| 6f8282f01e | |||
| 4f390ea18f | |||
| cb9a34c6f7 | |||
| 6759aff220 | |||
| b33f4ba300 | |||
| 85089898be | |||
| 4d65ab5a0b | |||
| abf1222f1d | |||
| b2ba9009d0 | |||
| 21ee7be30a | |||
| 9b78138600 | |||
| 160f70be63 | |||
| b98946b5c1 | |||
| 20ac0faa86 | |||
| 700e0fe7d7 | |||
| 328d8b5952 | |||
| 006b7f3f17 | |||
| 6eebcb5e48 | |||
| 0b01aa8276 | |||
| 049fbc92a9 | |||
| bc7720c0cd | |||
| 40fdf8f087 | |||
| 4fc1aba848 | |||
| 828a582f4d | |||
| d1d8417a61 | |||
| 5c3140811d | |||
| 4268d86da1 | |||
| bb017038d4 | |||
| d3f1f3533d | |||
| a445746a8b | |||
| b709baba7a | |||
| ef1d154a4a | |||
| a4bc9e669c | |||
| 5ea7a8373a | |||
| f29baed540 | |||
| d19fc64392 | |||
| 2b789ddab9 | |||
| 86b71b83fa | |||
| 486731162f | |||
| b6ab163814 | |||
| 2ea1bf0e1d | |||
| d9ad8caf02 | |||
| 14314b68ec | |||
| 3002e1cd60 | |||
| 00e738e485 | |||
| 1d6a92751b | |||
| e97e6865c3 | |||
| 55dcff746b | |||
| 691f02acab | |||
| 1f25312b65 | |||
| 26858fdebf | |||
| 7d8d0010e3 | |||
| 277042bc4e | |||
| 768182c691 | |||
| ab06d5c7fb | |||
| f97b8c835a | |||
| f375d9bd7b | |||
| e3d855673e | |||
| 62268aae65 | |||
| 09ddb5a724 | |||
| 56c44b053d | |||
| 2979da73cf | |||
| d3ac4ba83d | |||
| 203e44e026 | |||
| 4ab4dbb8a1 | |||
| 41c7ae5d54 | |||
| 2a72961be4 | |||
| 8d76d8c081 | |||
| c8995b91e2 | |||
| e492c613f7 | |||
| 6ac8f5abb7 | |||
| e0b413cf19 | |||
| a12ac5e175 | |||
| 462d3eeab1 | |||
| 97ec6c1be6 | |||
| 21070c0aaf | |||
| a96c5209d1 | |||
| e8dcbd8300 | |||
| cb75bec06d | |||
| 1e124e6713 | |||
| 84ad7cdc29 | |||
| 195d20cef2 | |||
| 91c8c6d96e | |||
| 1a4b82a5d6 | |||
| 4955aa5b78 | |||
| 131ddeaeba | |||
| b07dd44ec2 | |||
| 1793de4a28 | |||
| 646d90f3da | |||
| bd9dc73d3d | |||
| 5db62d7abd | |||
| 076f59c630 | |||
| 66694a213f | |||
| e2edfabc3c | |||
| f7fe499305 | |||
| f67ad6fd70 | |||
| c488070859 | |||
| 4b124352ef | |||
| 5dadba432e | |||
| dd6cbbbbad | |||
| 638f6f0f06 | |||
| b36163d53a | |||
| 6036a0df6b | |||
| bff0c68078 | |||
| 34fb9c7071 | |||
| d84aff701e | |||
| fa5a1f7d7f | |||
| ca105493aa | |||
| 434e43cc42 | |||
| a9f7e855d8 | |||
| 8cededa7dd | |||
| b6e4acec9d | |||
| aa92fa7ee3 | |||
| 563eda4b6b | |||
| 8652a7bdd2 | |||
| 93167afaf5 | |||
| 02ea13b511 | |||
| d6574a03a1 | |||
| ec02aee46c | |||
| 04909a2010 | |||
| 6b549e1971 | |||
| bb8606ac29 | |||
| 45d22d4f09 | |||
| a37cf24900 | |||
| b8c4098de2 | |||
| 4f67642122 | |||
| e2ee05c976 | |||
| 7e65464dd7 | |||
| d10b11ad9f | |||
| db8522b411 | |||
| ba6c41b798 | |||
| bf316d9ec5 | |||
| 7807b613d5 | |||
| 28a0650cf3 | |||
| 16e1dbbb21 | |||
| 853aec2c9a | |||
| 38cd7b9938 | |||
| 3426c7fc94 | |||
| 64e181979c | |||
| a4809b3a47 | |||
| a62ae2aa2d | |||
| d3c5161476 | |||
| 60b61de395 | |||
| f205bff2cc | |||
| 092aad1813 | |||
| 2cbc84855b | |||
| 167e42af99 | |||
| c55f477520 | |||
| ed775ac985 | |||
| 19818a95a2 | |||
| e70440b7cb | |||
| bb64aa7841 | |||
| 0e8cdd1938 | |||
| f7ff3f0803 | |||
| 8f730cfb6e | |||
| 6cfc4b5711 | |||
| 1b097d0467 | |||
| e69bbc3531 | |||
| 5038cddfd5 | |||
| 1b28a28ced | |||
| b11c3ddbed | |||
| 56b35fc103 | |||
| aaba9b7880 | |||
| 16cb4303a4 | |||
| 506deedfdd | |||
| 3ddb720722 | |||
| 567d77f1cb | |||
| f01cb240d7 | |||
| ff5c8d3570 | |||
| 3b9e0c3dde | |||
| ee28a10795 | |||
| ca4eaf92b4 | |||
| bd690f12bc | |||
| 9590fcd855 | |||
| b14f630f26 | |||
| 6dd054895b | |||
| f62578efec | |||
| d2d6c167df | |||
| 276d78461e | |||
| 911cdd4d2f | |||
| ce3df42e22 | |||
| f642656bff | |||
| b15c207d08 | |||
| 81f5973afc | |||
| f7b261a363 | |||
| 837dc4727d |
+2
-2
@@ -4,10 +4,10 @@ root = true
|
|||||||
[{*.patch,syntax_test_*}]
|
[{*.patch,syntax_test_*}]
|
||||||
trim_trailing_whitespace = false
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
[{*.c,*.cpp,*.h}]
|
[{*.c,*.cpp,*.h,*.ino}]
|
||||||
charset = utf-8
|
charset = utf-8
|
||||||
|
|
||||||
[{*.c,*.cpp,*.h,Makefile}]
|
[{*.c,*.cpp,*.h,*.ino,Makefile}]
|
||||||
trim_trailing_whitespace = true
|
trim_trailing_whitespace = true
|
||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
end_of_line = lf
|
end_of_line = lf
|
||||||
|
|||||||
@@ -17,3 +17,5 @@
|
|||||||
*.png binary
|
*.png binary
|
||||||
*.jpg binary
|
*.jpg binary
|
||||||
*.fon binary
|
*.fon binary
|
||||||
|
*.bin binary
|
||||||
|
*.woff binary
|
||||||
|
|||||||
@@ -36,64 +36,75 @@ jobs:
|
|||||||
# Base Environments
|
# Base Environments
|
||||||
|
|
||||||
- DUE
|
- DUE
|
||||||
|
- DUE_archim
|
||||||
- esp32
|
- esp32
|
||||||
- linux_native
|
- linux_native
|
||||||
- mega2560
|
- mega2560
|
||||||
|
- at90usb1286_dfu
|
||||||
- teensy31
|
- teensy31
|
||||||
- teensy35
|
- teensy35
|
||||||
|
- teensy41
|
||||||
- SAMD51_grandcentral_m4
|
- SAMD51_grandcentral_m4
|
||||||
|
|
||||||
# Extended AVR Environments
|
# Extended AVR Environments
|
||||||
|
|
||||||
- FYSETC_F6_13
|
- FYSETC_F6
|
||||||
- mega1280
|
- mega1280
|
||||||
- rambo
|
- rambo
|
||||||
- sanguino1284p
|
- sanguino1284p
|
||||||
- sanguino644p
|
- sanguino644p
|
||||||
|
|
||||||
# Extended STM32 Environments
|
# STM32F1 (Maple) Environments
|
||||||
|
|
||||||
- STM32F103RC_btt
|
#- STM32F103RC_btt_maple
|
||||||
- STM32F103RC_btt_USB
|
- STM32F103RC_btt_USB_maple
|
||||||
- STM32F103RE_btt
|
|
||||||
- STM32F103RE_btt_USB
|
|
||||||
- STM32F103RC_fysetc
|
- STM32F103RC_fysetc
|
||||||
- STM32F103RC_meeb
|
- STM32F103RC_meeb
|
||||||
- jgaurora_a5s_a1
|
- jgaurora_a5s_a1
|
||||||
- STM32F103VE_longer
|
- STM32F103VE_longer
|
||||||
|
#- mks_robin_maple
|
||||||
|
- mks_robin_lite
|
||||||
|
- mks_robin_pro
|
||||||
|
#- mks_robin_nano35_maple
|
||||||
|
#- STM32F103RET6_creality_maple
|
||||||
|
|
||||||
|
# STM32 (ST) Environments
|
||||||
|
|
||||||
|
- STM32F103RC_btt
|
||||||
|
#- STM32F103RC_btt_USB
|
||||||
|
- STM32F103RE_btt
|
||||||
|
- STM32F103RE_btt_USB
|
||||||
|
- STM32F103RET6_creality
|
||||||
- STM32F407VE_black
|
- STM32F407VE_black
|
||||||
- STM32F401VE_STEVAL
|
- STM32F401VE_STEVAL
|
||||||
- BIGTREE_BTT002
|
- BIGTREE_BTT002
|
||||||
- BIGTREE_SKR_PRO
|
- BIGTREE_SKR_PRO
|
||||||
- BIGTREE_GTR_V1_0
|
- BIGTREE_GTR_V1_0
|
||||||
- mks_robin
|
- mks_robin
|
||||||
- mks_robin_stm32
|
|
||||||
- ARMED
|
- ARMED
|
||||||
- FYSETC_S6
|
- FYSETC_S6
|
||||||
|
- STM32F070CB_malyan
|
||||||
- STM32F070RB_malyan
|
- STM32F070RB_malyan
|
||||||
- malyan_M300
|
- malyan_M300
|
||||||
- mks_robin_lite
|
|
||||||
- FLYF407ZG
|
- FLYF407ZG
|
||||||
- rumba32
|
- rumba32
|
||||||
- mks_robin_pro
|
|
||||||
- STM32F103RET6_creality
|
|
||||||
- LERDGEX
|
- LERDGEX
|
||||||
|
- LERDGEK
|
||||||
- mks_robin_nano35
|
- mks_robin_nano35
|
||||||
|
- NUCLEO_F767ZI
|
||||||
|
- REMRAM_V1
|
||||||
|
- BTT_SKR_SE_BX
|
||||||
|
- chitu_f103
|
||||||
|
|
||||||
# Put lengthy tests last
|
# Put lengthy tests last
|
||||||
|
|
||||||
- LPC1768
|
- LPC1768
|
||||||
- LPC1769
|
- LPC1769
|
||||||
|
|
||||||
# STM32 with non-STM framework. both broken for now. they should use HAL_STM32 which is working.
|
|
||||||
|
|
||||||
#- STM32F4
|
|
||||||
#- STM32F7
|
|
||||||
|
|
||||||
# Non-working environment tests
|
# Non-working environment tests
|
||||||
#- at90usb1286_cdc
|
#- at90usb1286_cdc
|
||||||
#- at90usb1286_dfu
|
|
||||||
#- STM32F103CB_malyan
|
#- STM32F103CB_malyan
|
||||||
|
#- STM32F103RE
|
||||||
#- mks_robin_mini
|
#- mks_robin_mini
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
@@ -114,8 +125,4 @@ jobs:
|
|||||||
|
|
||||||
- name: Run ${{ matrix.test-platform }} Tests
|
- name: Run ${{ matrix.test-platform }} Tests
|
||||||
run: |
|
run: |
|
||||||
# Inline tests script
|
make tests-single-ci TEST_TARGET=${{ matrix.test-platform }}
|
||||||
chmod +x buildroot/bin/*
|
|
||||||
chmod +x buildroot/tests/*
|
|
||||||
export PATH=./buildroot/bin/:./buildroot/tests/:${PATH}
|
|
||||||
run_tests . ${{ matrix.test-platform }}
|
|
||||||
|
|||||||
+15
-32
@@ -19,9 +19,9 @@
|
|||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
|
|
||||||
# Our automatic versioning scheme generates the following file
|
# Generated files
|
||||||
# NEVER put it in the repository
|
|
||||||
_Version.h
|
_Version.h
|
||||||
|
bdf2u8g
|
||||||
|
|
||||||
#
|
#
|
||||||
# OS
|
# OS
|
||||||
@@ -77,7 +77,6 @@ tags
|
|||||||
*.out
|
*.out
|
||||||
*.app
|
*.app
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# C
|
# C
|
||||||
#
|
#
|
||||||
@@ -123,33 +122,10 @@ tags
|
|||||||
.gcc-flags.json
|
.gcc-flags.json
|
||||||
/lib/
|
/lib/
|
||||||
|
|
||||||
# Workaround for Deviot+platformio quirks
|
|
||||||
Marlin/lib
|
|
||||||
Marlin/platformio.ini
|
|
||||||
Marlin/*/platformio.ini
|
|
||||||
Marlin/*/*/platformio.ini
|
|
||||||
Marlin/*/*/*/platformio.ini
|
|
||||||
Marlin/*/*/*/*/platformio.ini
|
|
||||||
Marlin/.travis.yml
|
|
||||||
Marlin/*/.travis.yml
|
|
||||||
Marlin/*/*/.travis.yml
|
|
||||||
Marlin/*/*/*/.travis.yml
|
|
||||||
Marlin/*/*/*/*/.travis.yml
|
|
||||||
Marlin/.gitignore
|
|
||||||
Marlin/*/.gitignore
|
|
||||||
Marlin/*/*/.gitignore
|
|
||||||
Marlin/*/*/*/.gitignore
|
|
||||||
Marlin/*/*/*/*/.gitignore
|
|
||||||
Marlin/readme.txt
|
|
||||||
Marlin/*/readme.txt
|
|
||||||
Marlin/*/*/readme.txt
|
|
||||||
Marlin/*/*/*/readme.txt
|
|
||||||
Marlin/*/*/*/*/readme.txt
|
|
||||||
|
|
||||||
# Secure Credentials
|
# Secure Credentials
|
||||||
Configuration_Secure.h
|
Configuration_Secure.h
|
||||||
|
|
||||||
#Visual Studio
|
# Visual Studio
|
||||||
*.sln
|
*.sln
|
||||||
*.vcxproj
|
*.vcxproj
|
||||||
*.vcxproj.user
|
*.vcxproj.user
|
||||||
@@ -160,27 +136,34 @@ __vm/
|
|||||||
.vs/
|
.vs/
|
||||||
vc-fileutils.settings
|
vc-fileutils.settings
|
||||||
|
|
||||||
#Visual Studio Code
|
# Visual Studio Code
|
||||||
.vscode
|
.vscode
|
||||||
.vscode/.browse.c_cpp.db*
|
.vscode/.browse.c_cpp.db*
|
||||||
.vscode/c_cpp_properties.json
|
.vscode/c_cpp_properties.json
|
||||||
.vscode/launch.json
|
.vscode/launch.json
|
||||||
.vscode/*.db
|
.vscode/*.db
|
||||||
|
|
||||||
#cmake
|
# cmake
|
||||||
CMakeLists.txt
|
CMakeLists.txt
|
||||||
src/CMakeLists.txt
|
src/CMakeLists.txt
|
||||||
CMakeListsPrivate.txt
|
CMakeListsPrivate.txt
|
||||||
|
|
||||||
#CLion
|
# CLion
|
||||||
cmake-build-*
|
cmake-build-*
|
||||||
|
|
||||||
#Eclipse
|
# Eclipse
|
||||||
.project
|
.project
|
||||||
.cproject
|
.cproject
|
||||||
.pydevproject
|
.pydevproject
|
||||||
.settings
|
.settings
|
||||||
.classpath
|
.classpath
|
||||||
|
|
||||||
#Python
|
# Python
|
||||||
__pycache__
|
__pycache__
|
||||||
|
|
||||||
|
# IOLogger logs
|
||||||
|
*_log.csv
|
||||||
|
|
||||||
|
# Simulation / Native
|
||||||
|
eeprom.dat
|
||||||
|
imgui.ini
|
||||||
|
|||||||
@@ -0,0 +1,52 @@
|
|||||||
|
help:
|
||||||
|
@echo "Tasks for local development:"
|
||||||
|
@echo "* tests-single-ci: Run a single test from inside the CI"
|
||||||
|
@echo "* tests-single-local: Run a single test locally"
|
||||||
|
@echo "* tests-single-local-docker: Run a single test locally, using docker-compose"
|
||||||
|
@echo "* tests-all-local: Run all tests locally"
|
||||||
|
@echo "* tests-all-local-docker: Run all tests locally, using docker-compose"
|
||||||
|
@echo "* setup-local-docker: Setup local docker-compose"
|
||||||
|
@echo ""
|
||||||
|
@echo "Options for testing:"
|
||||||
|
@echo " TEST_TARGET Set when running tests-single-*, to select the"
|
||||||
|
@echo " test. If you set it to ALL it will run all "
|
||||||
|
@echo " tests, but some of them are broken: use "
|
||||||
|
@echo " tests-all-* instead to run only the ones that "
|
||||||
|
@echo " run on GitHub CI"
|
||||||
|
@echo " ONLY_TEST Limit tests to only those that contain this, or"
|
||||||
|
@echo " the index of the test (1-based)"
|
||||||
|
@echo " VERBOSE_PLATFORMIO If you want the full PIO output, set any value"
|
||||||
|
@echo " GIT_RESET_HARD Used by CI: reset all local changes. WARNING:"
|
||||||
|
@echo " THIS WILL UNDO ANY CHANGES YOU'VE MADE!"
|
||||||
|
.PHONY: help
|
||||||
|
|
||||||
|
tests-single-ci:
|
||||||
|
export GIT_RESET_HARD=true
|
||||||
|
$(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET)
|
||||||
|
.PHONY: tests-single-ci
|
||||||
|
|
||||||
|
tests-single-local:
|
||||||
|
@if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET=<your-module> or use make tests-all-local" ; return 1; fi
|
||||||
|
export PATH=./buildroot/bin/:./buildroot/tests/:${PATH} \
|
||||||
|
&& export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \
|
||||||
|
&& run_tests . $(TEST_TARGET) "$(ONLY_TEST)"
|
||||||
|
.PHONY: tests-single-local
|
||||||
|
|
||||||
|
tests-single-local-docker:
|
||||||
|
@if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET=<your-module> or use make tests-all-local-docker" ; return 1; fi
|
||||||
|
docker-compose run --rm marlin $(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET) VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD) ONLY_TEST="$(ONLY_TEST)"
|
||||||
|
.PHONY: tests-single-local-docker
|
||||||
|
|
||||||
|
tests-all-local:
|
||||||
|
export PATH=./buildroot/bin/:./buildroot/tests/:${PATH} \
|
||||||
|
&& export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \
|
||||||
|
&& for TEST_TARGET in $$(./get_test_targets.py) ; do echo "Running tests for $$TEST_TARGET" ; run_tests . $$TEST_TARGET ; done
|
||||||
|
.PHONY: tests-all-local
|
||||||
|
|
||||||
|
tests-all-local-docker:
|
||||||
|
docker-compose run --rm marlin $(MAKE) tests-all-local VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD)
|
||||||
|
.PHONY: tests-all-local-docker
|
||||||
|
|
||||||
|
setup-local-docker:
|
||||||
|
docker-compose build
|
||||||
|
.PHONY: setup-local-docker
|
||||||
+721
-261
File diff suppressed because it is too large
Load Diff
+983
-372
File diff suppressed because it is too large
Load Diff
+187
-90
@@ -22,8 +22,10 @@
|
|||||||
# (e.g. UPLOAD_PORT = /dev/tty.USB0). If the exact name of this file
|
# (e.g. UPLOAD_PORT = /dev/tty.USB0). If the exact name of this file
|
||||||
# changes, you can use * as a wild card (e.g. UPLOAD_PORT = /dev/tty.usb*).
|
# changes, you can use * as a wild card (e.g. UPLOAD_PORT = /dev/tty.usb*).
|
||||||
#
|
#
|
||||||
# 3. Set the line containing "MCU" to match your board's processor.
|
# 3. Set the line containing "MCU" to match your board's processor. Set
|
||||||
# Older one's are atmega8 based, newer ones like Arduino Mini, Bluetooth
|
# "PROG_MCU" as the AVR part name corresponding to "MCU". You can use the
|
||||||
|
# following command to get a list of correspondences: `avrdude -c alf -p x`
|
||||||
|
# Older boards are atmega8 based, newer ones like Arduino Mini, Bluetooth
|
||||||
# or Diecimila have the atmega168. If you're using a LilyPad Arduino,
|
# or Diecimila have the atmega168. If you're using a LilyPad Arduino,
|
||||||
# change F_CPU to 8000000. If you are using Gen7 electronics, you
|
# change F_CPU to 8000000. If you are using Gen7 electronics, you
|
||||||
# probably need to use 20000000. Either way, you must regenerate
|
# probably need to use 20000000. Either way, you must regenerate
|
||||||
@@ -34,18 +36,18 @@
|
|||||||
# 5. Type "make upload", reset your Arduino board, and press enter to
|
# 5. Type "make upload", reset your Arduino board, and press enter to
|
||||||
# upload your program to the Arduino board.
|
# upload your program to the Arduino board.
|
||||||
#
|
#
|
||||||
# Note that all settings at the top of this file can be overriden from
|
# Note that all settings at the top of this file can be overridden from
|
||||||
# the command line with, for example, "make HARDWARE_MOTHERBOARD=71"
|
# the command line with, for example, "make HARDWARE_MOTHERBOARD=71"
|
||||||
#
|
#
|
||||||
# To compile for RAMPS (atmega2560) with Arduino 1.6.9 at root/arduino you would use...
|
# To compile for RAMPS (atmega2560) with Arduino 1.6.9 at root/arduino you would use...
|
||||||
#
|
#
|
||||||
# make ARDUINO_VERSION=10609 AVR_TOOLS_PATH=/root/arduino/hardware/tools/avr/bin/ \
|
# make ARDUINO_VERSION=10609 AVR_TOOLS_PATH=/root/arduino/hardware/tools/avr/bin/ \
|
||||||
# HARDWARE_MOTHERBOARD=33 ARDUINO_INSTALL_DIR=/root/arduino
|
# HARDWARE_MOTHERBOARD=1200 ARDUINO_INSTALL_DIR=/root/arduino
|
||||||
#
|
#
|
||||||
# To compile and upload simply add "upload" to the end of the line...
|
# To compile and upload simply add "upload" to the end of the line...
|
||||||
#
|
#
|
||||||
# make ARDUINO_VERSION=10609 AVR_TOOLS_PATH=/root/arduino/hardware/tools/avr/bin/ \
|
# make ARDUINO_VERSION=10609 AVR_TOOLS_PATH=/root/arduino/hardware/tools/avr/bin/ \
|
||||||
# HARDWARE_MOTHERBOARD=33 ARDUINO_INSTALL_DIR=/root/arduino upload
|
# HARDWARE_MOTHERBOARD=1200 ARDUINO_INSTALL_DIR=/root/arduino upload
|
||||||
#
|
#
|
||||||
# If uploading doesn't work try adding the parameter "AVRDUDE_PROGRAMMER=wiring" or
|
# If uploading doesn't work try adding the parameter "AVRDUDE_PROGRAMMER=wiring" or
|
||||||
# start upload manually (using stk500) like so:
|
# start upload manually (using stk500) like so:
|
||||||
@@ -57,7 +59,26 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
# This defines the board to compile for (see boards.h for your board's ID)
|
# This defines the board to compile for (see boards.h for your board's ID)
|
||||||
HARDWARE_MOTHERBOARD ?= 11
|
HARDWARE_MOTHERBOARD ?= 1020
|
||||||
|
|
||||||
|
ifeq ($(OS),Windows_NT)
|
||||||
|
# Windows
|
||||||
|
ARDUINO_INSTALL_DIR ?= ${HOME}/Arduino
|
||||||
|
ARDUINO_USER_DIR ?= ${HOME}/Arduino
|
||||||
|
else
|
||||||
|
UNAME_S := $(shell uname -s)
|
||||||
|
ifeq ($(UNAME_S),Linux)
|
||||||
|
# Linux
|
||||||
|
ARDUINO_INSTALL_DIR ?= /usr/share/arduino
|
||||||
|
ARDUINO_USER_DIR ?= ${HOME}/Arduino
|
||||||
|
endif
|
||||||
|
ifeq ($(UNAME_S),Darwin)
|
||||||
|
# Darwin (macOS)
|
||||||
|
ARDUINO_INSTALL_DIR ?= /Applications/Arduino.app/Contents/Java
|
||||||
|
ARDUINO_USER_DIR ?= ${HOME}/Documents/Arduino
|
||||||
|
AVR_TOOLS_PATH ?= /Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
# Arduino source install directory, and version number
|
# Arduino source install directory, and version number
|
||||||
# On most linuxes this will be /usr/share/arduino
|
# On most linuxes this will be /usr/share/arduino
|
||||||
@@ -67,32 +88,38 @@ ARDUINO_VERSION ?= 106
|
|||||||
# The installed Libraries are in the User folder
|
# The installed Libraries are in the User folder
|
||||||
ARDUINO_USER_DIR ?= ${HOME}/Arduino
|
ARDUINO_USER_DIR ?= ${HOME}/Arduino
|
||||||
|
|
||||||
# You can optionally set a path to the avr-gcc tools. Requires a trailing slash. (ex: /usr/local/avr-gcc/bin)
|
# You can optionally set a path to the avr-gcc tools.
|
||||||
|
# Requires a trailing slash. For example, /usr/local/avr-gcc/bin/
|
||||||
AVR_TOOLS_PATH ?=
|
AVR_TOOLS_PATH ?=
|
||||||
|
|
||||||
#Programmer configuration
|
# Programmer configuration
|
||||||
UPLOAD_RATE ?= 57600
|
UPLOAD_RATE ?= 57600
|
||||||
AVRDUDE_PROGRAMMER ?= arduino
|
AVRDUDE_PROGRAMMER ?= arduino
|
||||||
# on most linuxes this will be /dev/ttyACM0 or /dev/ttyACM1
|
# On most linuxes this will be /dev/ttyACM0 or /dev/ttyACM1
|
||||||
UPLOAD_PORT ?= /dev/ttyUSB0
|
UPLOAD_PORT ?= /dev/ttyUSB0
|
||||||
|
|
||||||
#Directory used to build files in, contains all the build files, from object files to the final hex file
|
# Directory used to build files in, contains all the build files, from object
|
||||||
#on linux it is best to put an absolute path like /home/username/tmp .
|
# files to the final hex file on linux it is best to put an absolute path
|
||||||
|
# like /home/username/tmp .
|
||||||
BUILD_DIR ?= applet
|
BUILD_DIR ?= applet
|
||||||
|
|
||||||
# This defines whether Liquid_TWI2 support will be built
|
# This defines whether Liquid_TWI2 support will be built
|
||||||
LIQUID_TWI2 ?= 0
|
LIQUID_TWI2 ?= 0
|
||||||
|
|
||||||
# this defines if Wire is needed
|
# This defines if Wire is needed
|
||||||
WIRE ?= 0
|
WIRE ?= 0
|
||||||
|
|
||||||
# this defines if U8GLIB is needed (may require RELOC_WORKAROUND)
|
# This defines if Tone is needed (i.e SPEAKER is defined in Configuration.h)
|
||||||
U8GLIB ?= 1
|
# Disabling this (and SPEAKER) saves approximatively 350 bytes of memory.
|
||||||
|
TONE ?= 1
|
||||||
|
|
||||||
# this defines whether to include the Trinamic TMCStepper library
|
# This defines if U8GLIB is needed (may require RELOC_WORKAROUND)
|
||||||
TMC ?= 1
|
U8GLIB ?= 0
|
||||||
|
|
||||||
# this defines whether to include the AdaFruit NeoPixel library
|
# This defines whether to include the Trinamic TMCStepper library
|
||||||
|
TMC ?= 0
|
||||||
|
|
||||||
|
# This defines whether to include the AdaFruit NeoPixel library
|
||||||
NEOPIXEL ?= 0
|
NEOPIXEL ?= 0
|
||||||
|
|
||||||
############
|
############
|
||||||
@@ -170,110 +197,115 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1100)
|
|||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1101)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1101)
|
||||||
# Velleman K8400 Controller (derived from 3Drag Controller)
|
# Velleman K8400 Controller (derived from 3Drag Controller)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1102)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1102)
|
||||||
# Velleman K8600 Controller (derived from 3Drag Controller)
|
# Velleman K8600 Controller (Vertex Nano)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1103)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1103)
|
||||||
# 2PrintBeta BAM&DICE with STK drivers
|
# Velleman K8800 Controller (Vertex Delta)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1104)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1104)
|
||||||
# 2PrintBeta BAM&DICE Due with STK drivers
|
# 2PrintBeta BAM&DICE with STK drivers
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1105)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1105)
|
||||||
# MKS BASE v1.0
|
# 2PrintBeta BAM&DICE Due with STK drivers
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1106)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1106)
|
||||||
# MKS v1.4 with A4982 stepper drivers
|
# MKS BASE v1.0
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1107)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1107)
|
||||||
# MKS v1.5 with Allegro A4982 stepper drivers
|
# MKS v1.4 with A4982 stepper drivers
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1108)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1108)
|
||||||
# MKS v1.6 with Allegro A4982 stepper drivers
|
# MKS v1.5 with Allegro A4982 stepper drivers
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1109)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1109)
|
||||||
# MKS BASE 1.0 with Heroic HR4982 stepper drivers
|
# MKS v1.6 with Allegro A4982 stepper drivers
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1110)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1110)
|
||||||
# MKS GEN v1.3 or 1.4
|
# MKS BASE 1.0 with Heroic HR4982 stepper drivers
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1111)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1111)
|
||||||
# MKS GEN L
|
# MKS GEN v1.3 or 1.4
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1112)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1112)
|
||||||
# zrib V2.0 control board (Chinese knock off RAMPS replica)
|
# MKS GEN L
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1113)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1113)
|
||||||
# BigTreeTech or BIQU KFB2.0
|
# zrib V2.0 control board (Chinese RAMPS replica)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1114)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1114)
|
||||||
# Felix 2.0+ Electronics Board (RAMPS like)
|
# BigTreeTech or BIQU KFB2.0
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1115)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1115)
|
||||||
# Invent-A-Part RigidBoard
|
# Felix 2.0+ Electronics Board (RAMPS like)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1116)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1116)
|
||||||
# Invent-A-Part RigidBoard V2
|
# Invent-A-Part RigidBoard
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1117)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1117)
|
||||||
# Sainsmart 2-in-1 board
|
# Invent-A-Part RigidBoard V2
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1118)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1118)
|
||||||
# Ultimaker
|
# Sainsmart 2-in-1 board
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1119)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1119)
|
||||||
# Ultimaker (Older electronics. Pre 1.5.4. This is rare)
|
# Ultimaker
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1120)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1120)
|
||||||
MCU ?= atmega1280
|
# Ultimaker (Older electronics. Pre 1.5.4. This is rare)
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1121)
|
||||||
|
MCU ?= atmega1280
|
||||||
|
PROG_MCU ?= m1280
|
||||||
|
|
||||||
# Azteeg X3
|
# Azteeg X3
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1121)
|
|
||||||
# Azteeg X3 Pro
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1122)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1122)
|
||||||
# Ultimainboard 2.x (Uses TEMP_SENSOR 20)
|
# Azteeg X3 Pro
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1123)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1123)
|
||||||
# Rumba
|
# Ultimainboard 2.x (Uses TEMP_SENSOR 20)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1124)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1124)
|
||||||
# Raise3D Rumba
|
# Rumba
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1125)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1125)
|
||||||
# Rapide Lite RL200 Rumba
|
# Raise3D Rumba
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1126)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1126)
|
||||||
# Formbot T-Rex 2 Plus
|
# Rapide Lite RL200 Rumba
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1127)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1127)
|
||||||
# Formbot T-Rex 3
|
# Formbot T-Rex 2 Plus
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1128)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1128)
|
||||||
# Formbot Raptor
|
# Formbot T-Rex 3
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1129)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1129)
|
||||||
# Formbot Raptor 2
|
# Formbot Raptor
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1130)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1130)
|
||||||
# bq ZUM Mega 3D
|
# Formbot Raptor 2
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1131)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1131)
|
||||||
# MakeBoard Mini v2.1.2 is a control board sold by MicroMake
|
# bq ZUM Mega 3D
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1132)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1132)
|
||||||
# TriGorilla Anycubic version 1.3 based on RAMPS EFB
|
# MakeBoard Mini v2.1.2 is a control board sold by MicroMake
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1133)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1133)
|
||||||
# TriGorilla Anycubic version 1.4 based on RAMPS EFB
|
# TriGorilla Anycubic version 1.3 based on RAMPS EFB
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1134)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1134)
|
||||||
# TriGorilla Anycubic version 1.4 Rev 1.1
|
# TriGorilla Anycubic version 1.4 based on RAMPS EFB
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1135)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1135)
|
||||||
# Creality: Ender-4, CR-8
|
# TriGorilla Anycubic version 1.4 Rev 1.1
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1136)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1136)
|
||||||
# Creality: CR10S, CR20, CR-X
|
# Creality: Ender-4, CR-8
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1137)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1137)
|
||||||
# Dagoma F5
|
# Creality: CR10S, CR20, CR-X
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1138)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1138)
|
||||||
# FYSETC F6 1.3
|
# Dagoma F5
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1139)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1139)
|
||||||
# FYSETC F6 1.5
|
# FYSETC F6 1.3
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1140)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1140)
|
||||||
# Duplicator i3 Plus
|
# FYSETC F6 1.5
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1141)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1141)
|
||||||
# VORON
|
# Duplicator i3 Plus
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1142)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1142)
|
||||||
# TRONXY V3 1.0
|
# VORON
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1143)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1143)
|
||||||
# Z-Bolt X Series
|
# TRONXY V3 1.0
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1144)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1144)
|
||||||
# TT OSCAR
|
# Z-Bolt X Series
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1145)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1145)
|
||||||
# Overlord/Overlord Pro
|
# TT OSCAR
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1146)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1146)
|
||||||
# ADIMLab Gantry v1
|
# Overlord/Overlord Pro
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1147)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1147)
|
||||||
# ADIMLab Gantry v2
|
# ADIMLab Gantry v1
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1148)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1148)
|
||||||
# BIQU Tango V1
|
# ADIMLab Gantry v2
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1149)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1149)
|
||||||
# MKS GEN L V2
|
# BIQU Tango V1
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1150)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1150)
|
||||||
# Copymaster 3D
|
# MKS GEN L V2
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1151)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1151)
|
||||||
# Ortur 4
|
# MKS GEN L V2.1
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1152)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1152)
|
||||||
# Tenlog D3 Hero
|
# Copymaster 3D
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1153)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1153)
|
||||||
|
# Ortur 4
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1154)
|
||||||
|
# Tenlog D3 Hero
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1155)
|
||||||
|
|
||||||
#
|
#
|
||||||
# RAMBo and derivatives
|
# RAMBo and derivatives
|
||||||
@@ -291,6 +323,8 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1203)
|
|||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1204)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1204)
|
||||||
# abee Scoovo X9H
|
# abee Scoovo X9H
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1205)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1205)
|
||||||
|
# Rambo ThinkerV2
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1206)
|
||||||
|
|
||||||
#
|
#
|
||||||
# Other ATmega1280, ATmega2560
|
# Other ATmega1280, ATmega2560
|
||||||
@@ -346,9 +380,11 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1320)
|
|||||||
# Minitronics v1.0/1.1
|
# Minitronics v1.0/1.1
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1400)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1400)
|
||||||
MCU ?= atmega1281
|
MCU ?= atmega1281
|
||||||
|
PROG_MCU ?= m1281
|
||||||
# Silvergate v1.0
|
# Silvergate v1.0
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1401)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1401)
|
||||||
MCU ?= atmega1281
|
MCU ?= atmega1281
|
||||||
|
PROG_MCU ?= m1281
|
||||||
|
|
||||||
#
|
#
|
||||||
# Sanguinololu and Derivatives - ATmega644P, ATmega1284P
|
# Sanguinololu and Derivatives - ATmega644P, ATmega1284P
|
||||||
@@ -358,46 +394,57 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1401)
|
|||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1500)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1500)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega644p
|
MCU ?= atmega644p
|
||||||
|
PROG_MCU ?= m644p
|
||||||
# Sanguinololu 1.2 and above
|
# Sanguinololu 1.2 and above
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1501)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1501)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega644p
|
MCU ?= atmega644p
|
||||||
|
PROG_MCU ?= m644p
|
||||||
# Melzi
|
# Melzi
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1502)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1502)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega644p
|
MCU ?= atmega644p
|
||||||
|
PROG_MCU ?= m644p
|
||||||
# Melzi V2.0
|
# Melzi V2.0
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1503)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1503)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega1284p
|
MCU ?= atmega1284p
|
||||||
|
PROG_MCU ?= m1284p
|
||||||
# Melzi with ATmega1284 (MaKr3d version)
|
# Melzi with ATmega1284 (MaKr3d version)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1504)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1504)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega1284p
|
MCU ?= atmega1284p
|
||||||
|
PROG_MCU ?= m1284p
|
||||||
# Melzi Creality3D board (for CR-10 etc)
|
# Melzi Creality3D board (for CR-10 etc)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1505)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1505)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega1284p
|
MCU ?= atmega1284p
|
||||||
|
PROG_MCU ?= m1284p
|
||||||
# Melzi Malyan M150 board
|
# Melzi Malyan M150 board
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1506)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1506)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega1284p
|
MCU ?= atmega1284p
|
||||||
|
PROG_MCU ?= m1284p
|
||||||
# Tronxy X5S
|
# Tronxy X5S
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1507)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1507)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega1284p
|
MCU ?= atmega1284p
|
||||||
|
PROG_MCU ?= m1284p
|
||||||
# STB V1.1
|
# STB V1.1
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1508)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1508)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega1284p
|
MCU ?= atmega1284p
|
||||||
|
PROG_MCU ?= m1284p
|
||||||
# Azteeg X1
|
# Azteeg X1
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1509)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1509)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega1284p
|
MCU ?= atmega1284p
|
||||||
|
PROG_MCU ?= m1284p
|
||||||
# Anet 1.0 (Melzi clone)
|
# Anet 1.0 (Melzi clone)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1510)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1510)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega1284p
|
MCU ?= atmega1284p
|
||||||
|
PROG_MCU ?= m1284p
|
||||||
|
|
||||||
#
|
#
|
||||||
# Other ATmega644P, ATmega644, ATmega1284P
|
# Other ATmega644P, ATmega644, ATmega1284P
|
||||||
@@ -407,50 +454,61 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1510)
|
|||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1600)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1600)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega644p
|
MCU ?= atmega644p
|
||||||
|
PROG_MCU ?= m644p
|
||||||
# Gen3+
|
# Gen3+
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1601)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1601)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega644p
|
MCU ?= atmega644p
|
||||||
|
PROG_MCU ?= m644p
|
||||||
# Gen6
|
# Gen6
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1602)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1602)
|
||||||
HARDWARE_VARIANT ?= Gen6
|
HARDWARE_VARIANT ?= Gen6
|
||||||
MCU ?= atmega644p
|
MCU ?= atmega644p
|
||||||
|
PROG_MCU ?= m644p
|
||||||
# Gen6 deluxe
|
# Gen6 deluxe
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1603)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1603)
|
||||||
HARDWARE_VARIANT ?= Gen6
|
HARDWARE_VARIANT ?= Gen6
|
||||||
MCU ?= atmega644p
|
MCU ?= atmega644p
|
||||||
|
PROG_MCU ?= m644p
|
||||||
# Gen7 custom (Alfons3 Version)
|
# Gen7 custom (Alfons3 Version)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1604)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1604)
|
||||||
HARDWARE_VARIANT ?= Gen7
|
HARDWARE_VARIANT ?= Gen7
|
||||||
MCU ?= atmega644
|
MCU ?= atmega644
|
||||||
|
PROG_MCU ?= m644
|
||||||
F_CPU ?= 20000000
|
F_CPU ?= 20000000
|
||||||
# Gen7 v1.1, v1.2
|
# Gen7 v1.1, v1.2
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1605)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1605)
|
||||||
HARDWARE_VARIANT ?= Gen7
|
HARDWARE_VARIANT ?= Gen7
|
||||||
MCU ?= atmega644p
|
MCU ?= atmega644p
|
||||||
|
PROG_MCU ?= m644p
|
||||||
F_CPU ?= 20000000
|
F_CPU ?= 20000000
|
||||||
# Gen7 v1.3
|
# Gen7 v1.3
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1606)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1606)
|
||||||
HARDWARE_VARIANT ?= Gen7
|
HARDWARE_VARIANT ?= Gen7
|
||||||
MCU ?= atmega644p
|
MCU ?= atmega644p
|
||||||
|
PROG_MCU ?= m644p
|
||||||
F_CPU ?= 20000000
|
F_CPU ?= 20000000
|
||||||
# Gen7 v1.4
|
# Gen7 v1.4
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1607)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1607)
|
||||||
HARDWARE_VARIANT ?= Gen7
|
HARDWARE_VARIANT ?= Gen7
|
||||||
MCU ?= atmega1284p
|
MCU ?= atmega1284p
|
||||||
|
PROG_MCU ?= m1284p
|
||||||
F_CPU ?= 20000000
|
F_CPU ?= 20000000
|
||||||
# Alpha OMCA board
|
# Alpha OMCA board
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1608)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1608)
|
||||||
HARDWARE_VARIANT ?= SanguinoA
|
HARDWARE_VARIANT ?= SanguinoA
|
||||||
MCU ?= atmega644
|
MCU ?= atmega644
|
||||||
|
PROG_MCU ?= m644
|
||||||
# Final OMCA board
|
# Final OMCA board
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1609)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1609)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega644p
|
MCU ?= atmega644p
|
||||||
|
PROG_MCU ?= m644p
|
||||||
# Sethi 3D_1
|
# Sethi 3D_1
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1610)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1610)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega644p
|
MCU ?= atmega644p
|
||||||
|
PROG_MCU ?= m644p
|
||||||
|
|
||||||
#
|
#
|
||||||
# Teensyduino - AT90USB1286, AT90USB1286P
|
# Teensyduino - AT90USB1286, AT90USB1286P
|
||||||
@@ -460,51 +518,60 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1610)
|
|||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1700)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1700)
|
||||||
HARDWARE_VARIANT ?= Teensy
|
HARDWARE_VARIANT ?= Teensy
|
||||||
MCU ?= at90usb1286
|
MCU ?= at90usb1286
|
||||||
|
PROG_MCU ?= usb1286
|
||||||
# Printrboard (AT90USB1286)
|
# Printrboard (AT90USB1286)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1701)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1701)
|
||||||
HARDWARE_VARIANT ?= Teensy
|
HARDWARE_VARIANT ?= Teensy
|
||||||
MCU ?= at90usb1286
|
MCU ?= at90usb1286
|
||||||
|
PROG_MCU ?= usb1286
|
||||||
# Printrboard Revision F (AT90USB1286)
|
# Printrboard Revision F (AT90USB1286)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1702)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1702)
|
||||||
HARDWARE_VARIANT ?= Teensy
|
HARDWARE_VARIANT ?= Teensy
|
||||||
MCU ?= at90usb1286
|
MCU ?= at90usb1286
|
||||||
|
PROG_MCU ?= usb1286
|
||||||
# Brainwave (AT90USB646)
|
# Brainwave (AT90USB646)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1703)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1703)
|
||||||
HARDWARE_VARIANT ?= Teensy
|
HARDWARE_VARIANT ?= Teensy
|
||||||
MCU ?= at90usb646
|
MCU ?= at90usb646
|
||||||
|
PROG_MCU ?= usb646
|
||||||
# Brainwave Pro (AT90USB1286)
|
# Brainwave Pro (AT90USB1286)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1704)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1704)
|
||||||
HARDWARE_VARIANT ?= Teensy
|
HARDWARE_VARIANT ?= Teensy
|
||||||
MCU ?= at90usb1286
|
MCU ?= at90usb1286
|
||||||
|
PROG_MCU ?= usb1286
|
||||||
# SAV Mk-I (AT90USB1286)
|
# SAV Mk-I (AT90USB1286)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1705)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1705)
|
||||||
HARDWARE_VARIANT ?= Teensy
|
HARDWARE_VARIANT ?= Teensy
|
||||||
MCU ?= at90usb1286
|
MCU ?= at90usb1286
|
||||||
|
PROG_MCU ?= usb1286
|
||||||
# Teensy++2.0 (AT90USB1286)
|
# Teensy++2.0 (AT90USB1286)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1706)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1706)
|
||||||
HARDWARE_VARIANT ?= Teensy
|
HARDWARE_VARIANT ?= Teensy
|
||||||
MCU ?= at90usb1286
|
MCU ?= at90usb1286
|
||||||
|
PROG_MCU ?= usb1286
|
||||||
# 5DPrint D8 Driver Board
|
# 5DPrint D8 Driver Board
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1707)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1707)
|
||||||
HARDWARE_VARIANT ?= Teensy
|
HARDWARE_VARIANT ?= Teensy
|
||||||
MCU ?= at90usb1286
|
MCU ?= at90usb1286
|
||||||
|
PROG_MCU ?= usb1286
|
||||||
|
|
||||||
# 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
|
||||||
MCPU = cortex-m3
|
MCPU = cortex-m3
|
||||||
F_CPU = 84000000L
|
F_CPU = 84000000
|
||||||
IS_MCU = 0
|
IS_MCU = 0
|
||||||
# UltiMachine Archim2 (with TMC2130 drivers)
|
# UltiMachine Archim2 (with TMC2130 drivers)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),3024)
|
else ifeq ($(HARDWARE_MOTHERBOARD),3024)
|
||||||
HARDWARE_VARIANT ?= archim
|
HARDWARE_VARIANT ?= archim
|
||||||
MCPU = cortex-m3
|
MCPU = cortex-m3
|
||||||
F_CPU = 84000000L
|
F_CPU = 84000000
|
||||||
IS_MCU = 0
|
IS_MCU = 0
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Be sure to regenerate speed_lookuptable.h with create_speed_lookuptable.py
|
# Be sure to regenerate speed_lookuptable.h with create_speed_lookuptable.py
|
||||||
# if you are setting this to something other than 16MHz
|
# if you are setting this to something other than 16MHz
|
||||||
|
# Do not put the UL suffix, it's done later on.
|
||||||
# Set to 16Mhz if not yet set.
|
# Set to 16Mhz if not yet set.
|
||||||
F_CPU ?= 16000000
|
F_CPU ?= 16000000
|
||||||
|
|
||||||
@@ -514,7 +581,8 @@ IS_MCU ?= 1
|
|||||||
ifeq ($(IS_MCU),1)
|
ifeq ($(IS_MCU),1)
|
||||||
# Set to arduino, ATmega2560 if not yet set.
|
# Set to arduino, ATmega2560 if not yet set.
|
||||||
HARDWARE_VARIANT ?= arduino
|
HARDWARE_VARIANT ?= arduino
|
||||||
MCU ?= atmega2560
|
MCU ?= atmega2560
|
||||||
|
PROG_MCU ?= m2560
|
||||||
|
|
||||||
TOOL_PREFIX = avr
|
TOOL_PREFIX = avr
|
||||||
MCU_FLAGS = -mmcu=$(MCU)
|
MCU_FLAGS = -mmcu=$(MCU)
|
||||||
@@ -545,27 +613,36 @@ VPATH += $(BUILD_DIR)
|
|||||||
VPATH += $(HARDWARE_SRC)
|
VPATH += $(HARDWARE_SRC)
|
||||||
|
|
||||||
ifeq ($(HARDWARE_VARIANT), $(filter $(HARDWARE_VARIANT),arduino Teensy Sanguino))
|
ifeq ($(HARDWARE_VARIANT), $(filter $(HARDWARE_VARIANT),arduino Teensy Sanguino))
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/marlin/avr/libraries/LiquidCrystal/src
|
# Old libraries (avr-core 1.6.21 < / Arduino < 1.6.8)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/marlin/avr/libraries/SPI
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI
|
||||||
|
# New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8)
|
||||||
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI/src
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(IS_MCU),1)
|
ifeq ($(IS_MCU),1)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/cores/arduino
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/cores/arduino
|
||||||
|
|
||||||
|
# Old libraries (avr-core 1.6.21 < / Arduino < 1.6.8)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI
|
||||||
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SoftwareSerial
|
||||||
|
# New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI/src
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI/src
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SoftwareSerial/src
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SoftwareSerial/src
|
||||||
endif
|
endif
|
||||||
|
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/LiquidCrystal/src
|
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/LiquidCrystal/src
|
||||||
|
|
||||||
ifeq ($(LIQUID_TWI2), 1)
|
ifeq ($(LIQUID_TWI2), 1)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Wire
|
WIRE = 1
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Wire/utility
|
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/LiquidTWI2
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/LiquidTWI2
|
|
||||||
endif
|
endif
|
||||||
ifeq ($(WIRE), 1)
|
ifeq ($(WIRE), 1)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Wire
|
# Old libraries (avr-core 1.6.21 / Arduino < 1.6.8)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Wire/utility
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire
|
||||||
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire/utility
|
||||||
|
# New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8)
|
||||||
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire/src
|
||||||
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire/src/utility
|
||||||
endif
|
endif
|
||||||
ifeq ($(NEOPIXEL), 1)
|
ifeq ($(NEOPIXEL), 1)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Adafruit_NeoPixel
|
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Adafruit_NeoPixel
|
||||||
@@ -637,13 +714,23 @@ ifeq ($(WIRE), 1)
|
|||||||
LIB_CXXSRC += Wire.cpp
|
LIB_CXXSRC += Wire.cpp
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(TONE), 1)
|
||||||
|
LIB_CXXSRC += Tone.cpp
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(U8GLIB), 1)
|
ifeq ($(U8GLIB), 1)
|
||||||
LIB_CXXSRC += U8glib.cpp
|
LIB_CXXSRC += U8glib.cpp
|
||||||
LIB_SRC += u8g_ll_api.c u8g_bitmap.c u8g_clip.c u8g_com_null.c u8g_delay.c u8g_page.c u8g_pb.c u8g_pb16h1.c u8g_rect.c u8g_state.c u8g_font.c u8g_font_6x13.c u8g_font_04b_03.c u8g_font_5x8.c
|
LIB_SRC += u8g_ll_api.c u8g_bitmap.c u8g_clip.c u8g_com_null.c u8g_delay.c \
|
||||||
|
u8g_page.c u8g_pb.c u8g_pb16h1.c u8g_rect.c u8g_state.c u8g_font.c \
|
||||||
|
u8g_font_6x13.c u8g_font_04b_03.c u8g_font_5x8.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(TMC), 1)
|
ifeq ($(TMC), 1)
|
||||||
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 DRVSTATUS.cpp ENCMODE.cpp RAMP_STAT.cpp SGCSCONF.cpp SHORT_CONF.cpp SMARTEN.cpp SW_MODE.cpp SW_SPI.cpp TMC2130Stepper.cpp TMC2208Stepper.cpp TMC2209Stepper.cpp TMC2660Stepper.cpp TMC5130Stepper.cpp TMC5160Stepper.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 \
|
||||||
|
DRVSTATUS.cpp ENCMODE.cpp RAMP_STAT.cpp SGCSCONF.cpp SHORT_CONF.cpp \
|
||||||
|
SMARTEN.cpp SW_MODE.cpp SW_SPI.cpp TMC2130Stepper.cpp TMC2208Stepper.cpp \
|
||||||
|
TMC2209Stepper.cpp TMC2660Stepper.cpp TMC5130Stepper.cpp TMC5160Stepper.cpp
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(RELOC_WORKAROUND), 1)
|
ifeq ($(RELOC_WORKAROUND), 1)
|
||||||
@@ -685,17 +772,23 @@ REMOVE = rm -f
|
|||||||
MV = mv -f
|
MV = mv -f
|
||||||
|
|
||||||
# Place -D or -U options here
|
# Place -D or -U options here
|
||||||
CDEFS = -DF_CPU=$(F_CPU) ${addprefix -D , $(DEFINES)} -DARDUINO=$(ARDUINO_VERSION)
|
CDEFS = -DF_CPU=$(F_CPU)UL ${addprefix -D , $(DEFINES)} -DARDUINO=$(ARDUINO_VERSION)
|
||||||
CXXDEFS = $(CDEFS)
|
CXXDEFS = $(CDEFS)
|
||||||
|
|
||||||
ifeq ($(HARDWARE_VARIANT), Teensy)
|
ifeq ($(HARDWARE_VARIANT), Teensy)
|
||||||
CDEFS += -DUSB_SERIAL
|
CDEFS += -DUSB_SERIAL
|
||||||
LIB_SRC += usb.c pins_teensy.c
|
LIB_SRC += usb.c pins_teensy.c
|
||||||
LIB_CXXSRC += usb_api.cpp
|
LIB_CXXSRC += usb_api.cpp
|
||||||
|
|
||||||
else ifeq ($(HARDWARE_VARIANT), archim)
|
else ifeq ($(HARDWARE_VARIANT), archim)
|
||||||
CDEFS += -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__ -DUSB_VID=0x27b1 -DUSB_PID=0x0001 -DUSBCON '-DUSB_MANUFACTURER="UltiMachine"' '-DUSB_PRODUCT="Archim"'
|
CDEFS += -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__
|
||||||
LIB_CXXSRC += variant.cpp IPAddress.cpp Reset.cpp RingBuffer.cpp Stream.cpp UARTClass.cpp USARTClass.cpp abi.cpp new.cpp watchdog.cpp CDC.cpp PluggableUSB.cpp USBCore.cpp
|
CDEFS += -DUSB_VID=0x27B1 -DUSB_PID=0x0001 -DUSBCON
|
||||||
|
CDEFS += '-DUSB_MANUFACTURER="UltiMachine"' '-DUSB_PRODUCT_STRING="Archim"'
|
||||||
|
|
||||||
|
LIB_CXXSRC += variant.cpp IPAddress.cpp Reset.cpp RingBuffer.cpp Stream.cpp \
|
||||||
|
UARTClass.cpp USARTClass.cpp abi.cpp new.cpp watchdog.cpp CDC.cpp \
|
||||||
|
PluggableUSB.cpp USBCore.cpp
|
||||||
|
|
||||||
LIB_SRC += cortex_handlers.c iar_calls_sam3.c syscalls_sam3.c dtostrf.c itoa.c
|
LIB_SRC += cortex_handlers.c iar_calls_sam3.c syscalls_sam3.c dtostrf.c itoa.c
|
||||||
|
|
||||||
ifeq ($(U8GLIB), 1)
|
ifeq ($(U8GLIB), 1)
|
||||||
@@ -721,16 +814,20 @@ CTUNING = -fsigned-char -funsigned-bitfields -fno-exceptions \
|
|||||||
ifneq ($(HARDWARE_MOTHERBOARD),)
|
ifneq ($(HARDWARE_MOTHERBOARD),)
|
||||||
CTUNING += -DMOTHERBOARD=${HARDWARE_MOTHERBOARD}
|
CTUNING += -DMOTHERBOARD=${HARDWARE_MOTHERBOARD}
|
||||||
endif
|
endif
|
||||||
|
|
||||||
#CEXTRA = -Wa,-adhlns=$(<:.c=.lst)
|
#CEXTRA = -Wa,-adhlns=$(<:.c=.lst)
|
||||||
CXXEXTRA = -fno-use-cxa-atexit -fno-threadsafe-statics -fno-rtti
|
CXXEXTRA = -fno-use-cxa-atexit -fno-threadsafe-statics -fno-rtti
|
||||||
CFLAGS := $(CDEBUG) $(CDEFS) $(CINCS) -O$(OPT) $(CEXTRA) $(CTUNING) $(CSTANDARD)
|
CFLAGS := $(CDEBUG) $(CDEFS) $(CINCS) -O$(OPT) $(CEXTRA) $(CTUNING) $(CSTANDARD)
|
||||||
CXXFLAGS := $(CDEFS) $(CINCS) -O$(OPT) $(CXXEXTRA) $(CTUNING) $(CXXSTANDARD)
|
CXXFLAGS := $(CDEFS) $(CINCS) -O$(OPT) $(CXXEXTRA) $(CTUNING) $(CXXSTANDARD)
|
||||||
ASFLAGS := $(CDEFS)
|
ASFLAGS := $(CDEFS)
|
||||||
#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
|
#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
|
||||||
|
|
||||||
ifeq ($(HARDWARE_VARIANT), archim)
|
ifeq ($(HARDWARE_VARIANT), archim)
|
||||||
LD_PREFIX = -Wl,--gc-sections,-Map,Marlin.ino.map,--cref,--check-sections,--entry=Reset_Handler,--unresolved-symbols=report-all,--warn-common,--warn-section-align
|
LD_PREFIX = -Wl,--gc-sections,-Map,Marlin.ino.map,--cref,--check-sections,--entry=Reset_Handler,--unresolved-symbols=report-all,--warn-common,--warn-section-align
|
||||||
LD_SUFFIX = $(LDLIBS)
|
LD_SUFFIX = $(LDLIBS)
|
||||||
LDFLAGS = -lm -T$(LDSCRIPT) -u _sbrk -u link -u _close -u _fstat -u _isatty -u _lseek -u _read -u _write -u _exit -u kill -u _getpid
|
|
||||||
|
LDFLAGS = -lm -T$(LDSCRIPT) -u _sbrk -u link -u _close -u _fstat -u _isatty
|
||||||
|
LDFLAGS += -u _lseek -u _read -u _write -u _exit -u kill -u _getpid
|
||||||
else
|
else
|
||||||
LD_PREFIX = -Wl,--gc-sections,--relax
|
LD_PREFIX = -Wl,--gc-sections,--relax
|
||||||
LDFLAGS = -lm
|
LDFLAGS = -lm
|
||||||
@@ -746,7 +843,7 @@ else
|
|||||||
AVRDUDE_CONF = $(ARDUINO_INSTALL_DIR)/hardware/tools/avr/etc/avrdude.conf
|
AVRDUDE_CONF = $(ARDUINO_INSTALL_DIR)/hardware/tools/avr/etc/avrdude.conf
|
||||||
endif
|
endif
|
||||||
AVRDUDE_FLAGS = -D -C$(AVRDUDE_CONF) \
|
AVRDUDE_FLAGS = -D -C$(AVRDUDE_CONF) \
|
||||||
-p$(MCU) -P$(AVRDUDE_PORT) -c$(AVRDUDE_PROGRAMMER) \
|
-p$(PROG_MCU) -P$(AVRDUDE_PORT) -c$(AVRDUDE_PROGRAMMER) \
|
||||||
-b$(UPLOAD_RATE)
|
-b$(UPLOAD_RATE)
|
||||||
|
|
||||||
# Since Marlin 2.0, the source files may be distributed into several
|
# Since Marlin 2.0, the source files may be distributed into several
|
||||||
@@ -847,7 +944,7 @@ extcoff: $(TARGET).elf
|
|||||||
|
|
||||||
.elf.eep:
|
.elf.eep:
|
||||||
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
|
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
|
||||||
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@
|
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@
|
||||||
|
|
||||||
# Create extended listing file from ELF output file.
|
# Create extended listing file from ELF output file.
|
||||||
.elf.lss:
|
.elf.lss:
|
||||||
@@ -861,7 +958,7 @@ extcoff: $(TARGET).elf
|
|||||||
|
|
||||||
$(BUILD_DIR)/$(TARGET).elf: $(OBJ) Configuration.h
|
$(BUILD_DIR)/$(TARGET).elf: $(OBJ) Configuration.h
|
||||||
$(Pecho) " CXX $@"
|
$(Pecho) " CXX $@"
|
||||||
$P $(CC) $(LD_PREFIX) $(ALL_CXXFLAGS) -o $@ -L. $(OBJ) $(LDFLAGS) $(LD_SUFFIX)
|
$P $(CXX) $(LD_PREFIX) $(ALL_CXXFLAGS) -o $@ -L. $(OBJ) $(LDFLAGS) $(LD_SUFFIX)
|
||||||
|
|
||||||
# Object files that were found in "src" will be stored in $(BUILD_DIR)
|
# Object files that were found in "src" will be stored in $(BUILD_DIR)
|
||||||
# in directories that mirror the structure of "src"
|
# in directories that mirror the structure of "src"
|
||||||
@@ -896,5 +993,5 @@ clean:
|
|||||||
|
|
||||||
.PHONY: all build elf hex eep lss sym program coff extcoff clean depend sizebefore sizeafter
|
.PHONY: all build elf hex eep lss sym program coff extcoff clean depend sizebefore sizeafter
|
||||||
|
|
||||||
# Automaticaly include the dependency files created by gcc
|
# Automatically include the dependency files created by gcc
|
||||||
-include ${patsubst %.o, %.d, ${OBJ}}
|
-include ${patsubst %.o, %.d, ${OBJ}}
|
||||||
|
|||||||
+6
-6
@@ -28,25 +28,25 @@
|
|||||||
/**
|
/**
|
||||||
* Marlin release version identifier
|
* Marlin release version identifier
|
||||||
*/
|
*/
|
||||||
//#define SHORT_BUILD_VERSION "bugfix-2.0.x"
|
#define SHORT_BUILD_VERSION "2.0.8"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verbose version identifier which should contain a reference to the location
|
* Verbose version identifier which should contain a reference to the location
|
||||||
* from where the binary was downloaded or the source code was compiled.
|
* from where the binary was downloaded or the source code was compiled.
|
||||||
*/
|
*/
|
||||||
//#define DETAILED_BUILD_VERSION SHORT_BUILD_VERSION
|
#define DETAILED_BUILD_VERSION "IA_" SHORT_BUILD_VERSION
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The STRING_DISTRIBUTION_DATE represents when the binary file was built,
|
* The STRING_DISTRIBUTION_DATE represents when the binary file was built,
|
||||||
* 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 "2019-07-10"
|
#define STRING_DISTRIBUTION_DATE "2021-06-05"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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.
|
||||||
*/
|
*/
|
||||||
//#define MACHINE_NAME "3D Printer"
|
#define MACHINE_NAME "Insanity Automation S8"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
||||||
@@ -54,7 +54,7 @@
|
|||||||
* 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 "https://github.com/MarlinFirmware/Marlin"
|
#define SOURCE_CODE_URL "github.com/InsanityAutomation"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default generic printer UUID.
|
* Default generic printer UUID.
|
||||||
@@ -65,7 +65,7 @@
|
|||||||
* The WEBSITE_URL is the location where users can get more information such as
|
* The WEBSITE_URL is the location where users can get more information such as
|
||||||
* documentation about a specific Marlin release.
|
* documentation about a specific Marlin release.
|
||||||
*/
|
*/
|
||||||
//#define WEBSITE_URL "https://marlinfw.org"
|
//#define WEBSITE_URL "insanityautomation.com"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the vendor info the serial USB interface, if changable
|
* Set the vendor info the serial USB interface, if changable
|
||||||
|
|||||||
@@ -0,0 +1,113 @@
|
|||||||
|
/**
|
||||||
|
* Marlin 3D Printer Firmware
|
||||||
|
* Copyright (C) 2016 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom Bitmap for splashscreen
|
||||||
|
*
|
||||||
|
* You may use one of the following tools to generate the C++ bitmap array from
|
||||||
|
* a black and white image:
|
||||||
|
*
|
||||||
|
* - http://www.marlinfw.org/tools/u8glib/converter.html
|
||||||
|
* - http://www.digole.com/tools/PicturetoC_Hex_converter.php
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#define CUSTOM_BOOTSCREEN_TIMEOUT 2500
|
||||||
|
#define CUSTOM_BOOTSCREEN_BMPWIDTH 128
|
||||||
|
#define CUSTOM_BOOTSCREEN_BMPHEIGHT 64
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Made with Marlin Bitmap Converter
|
||||||
|
* https://marlinfw.org/tools/u8glib/converter.html
|
||||||
|
*
|
||||||
|
* This bitmap from 128x64 C/C++ data
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#define HMIJ3S_BMPWIDTH 128
|
||||||
|
|
||||||
|
const unsigned char custom_start_bmp[] PROGMEM = {
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11111111,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11111111,B11111111,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111111,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111111,B11111110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111,B11111111,B01111111,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111110,B00011111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111100,B00001111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111,B11111000,B00000011,B11111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111111,B11111000,B00000001,B11111111,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11110000,B00000000,B11111111,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11111111,B11100000,B00000000,B00111111,B11111110,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11000000,B00000000,B00001111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B10000000,B00000000,B00000111,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B00000000,B00000000,B00000001,B11111111,B11111000,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B01111111,B11111111,B00000000,B00000000,B00000000,B11111111,B11111110,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111110,B00000000,B00000000,B00000000,B01111111,B11111111,B00000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000001,B11111111,B11111100,B00000000,B00000000,B00000000,B00011111,B11111111,B10000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000001,B11111111,B11111000,B00000000,B00000000,B00000000,B00001111,B11111111,B10000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000011,B11111111,B11110000,B00000000,B00000000,B00000000,B00000111,B11111111,B10000000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000111,B11111111,B11100000,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00001111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000011,B11111111,B11111110,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000001,B11111111,B11111110,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B11111110,B01111110,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000001,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B11111000,B00001110,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00001111,B11111111,B11111110,B00000000,B00000000,B00000000,B00000000,B00000000,B11110000,B00001110,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00011111,B11111111,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B11100000,B00000110,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00111111,B11111111,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B11100000,B00000110,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B01111111,B11111111,B11111000,B00000000,B00000000,B00000000,B00000000,B00000001,B11100000,B00000110,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B01111111,B11111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111000,B00000110,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00000111,B11111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111,B00111110,B00000000,B00000000,B00000000,
|
||||||
|
B00000000,B00011111,B11111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111001,B11110000,B00000000,B00000000,
|
||||||
|
B00000000,B00011111,B11111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111,B11110000,B00000000,B00000000,
|
||||||
|
B00000000,B00011111,B11111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111111,B11000000,B00000000,B00000000,
|
||||||
|
B00000000,B00011111,B11111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111111,B11100010,B00000000,B00000000,
|
||||||
|
B00000000,B00011111,B11111111,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B10000000,B00000000,
|
||||||
|
B00000000,B00011111,B11111111,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01000011,B11111111,B11000000,B00000000,
|
||||||
|
B00000000,B00011111,B11111111,B11111111,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B10000000,B00000000,
|
||||||
|
B00000000,B00011111,B11111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11111100,B00000000,B00000000,
|
||||||
|
B00000000,B00001111,B11111111,B11111111,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111100,B00000000,B00000000,
|
||||||
|
B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00111100,B00000000,B00000000,
|
||||||
|
B00111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B00000000,B00000000,
|
||||||
|
B00111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11100001,B11000000,B00000000,
|
||||||
|
B00111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111,B11110000,B00000000,
|
||||||
|
B00111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111100,B00000000,
|
||||||
|
B00111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B00000000,
|
||||||
|
B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11100111,B11000000,
|
||||||
|
B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11000011,B11110000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11011111,B11100001,B10000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11110000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11100000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B00000000,B00000000,
|
||||||
|
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000
|
||||||
|
};
|
||||||
@@ -24,6 +24,13 @@
|
|||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
#include "HAL.h"
|
#include "HAL.h"
|
||||||
|
|
||||||
|
#ifdef USBCON
|
||||||
|
DefaultSerial1 MSerial0(false, Serial);
|
||||||
|
#ifdef BLUETOOTH
|
||||||
|
BTSerial btSerial(false, bluetoothSerial);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Public Variables
|
// Public Variables
|
||||||
// ------------------------
|
// ------------------------
|
||||||
@@ -51,6 +58,15 @@ void HAL_init() {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HAL_reboot() {
|
||||||
|
#if ENABLED(USE_WATCHDOG)
|
||||||
|
while (1) { /* run out the watchdog */ }
|
||||||
|
#else
|
||||||
|
void (*resetFunc)() = 0; // Declare resetFunc() at address 0
|
||||||
|
resetFunc(); // Jump to address 0
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
#if ENABLED(SDSUPPORT)
|
#if ENABLED(SDSUPPORT)
|
||||||
|
|
||||||
#include "../../sd/SdFatUtil.h"
|
#include "../../sd/SdFatUtil.h"
|
||||||
|
|||||||
+45
-41
@@ -15,6 +15,7 @@
|
|||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* 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
|
#pragma once
|
||||||
|
|
||||||
@@ -81,54 +82,51 @@ typedef int8_t pin_t;
|
|||||||
|
|
||||||
// Serial ports
|
// Serial ports
|
||||||
#ifdef USBCON
|
#ifdef USBCON
|
||||||
#if ENABLED(BLUETOOTH)
|
#include "../../core/serial_hook.h"
|
||||||
#define MYSERIAL0 bluetoothSerial
|
typedef ForwardSerial1Class< decltype(Serial) > DefaultSerial1;
|
||||||
#else
|
extern DefaultSerial1 MSerial0;
|
||||||
#define MYSERIAL0 Serial
|
#ifdef BLUETOOTH
|
||||||
#endif
|
typedef ForwardSerial1Class< decltype(bluetoothSerial) > BTSerial;
|
||||||
#define NUM_SERIAL 1
|
extern BTSerial btSerial;
|
||||||
#else
|
|
||||||
#if !WITHIN(SERIAL_PORT, -1, 3)
|
|
||||||
#error "SERIAL_PORT must be from -1 to 3. Please update your configuration."
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MYSERIAL0 customizedSerial1
|
#define MYSERIAL1 TERN(BLUETOOTH, btSerial, MSerial0)
|
||||||
|
#else
|
||||||
|
#if !WITHIN(SERIAL_PORT, -1, 3)
|
||||||
|
#error "SERIAL_PORT must be from 0 to 3, or -1 for USB Serial."
|
||||||
|
#endif
|
||||||
|
#define MYSERIAL1 customizedSerial1
|
||||||
|
|
||||||
#ifdef SERIAL_PORT_2
|
#ifdef SERIAL_PORT_2
|
||||||
#if !WITHIN(SERIAL_PORT_2, -1, 3)
|
#if !WITHIN(SERIAL_PORT_2, -1, 3)
|
||||||
#error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration."
|
#error "SERIAL_PORT_2 must be from 0 to 3, or -1 for USB Serial."
|
||||||
#elif SERIAL_PORT_2 == SERIAL_PORT
|
|
||||||
#error "SERIAL_PORT_2 must be different than SERIAL_PORT. Please update your configuration."
|
|
||||||
#endif
|
#endif
|
||||||
#define MYSERIAL1 customizedSerial2
|
#define MYSERIAL2 customizedSerial2
|
||||||
#define NUM_SERIAL 2
|
#endif
|
||||||
#else
|
|
||||||
#define NUM_SERIAL 1
|
#ifdef SERIAL_PORT_3
|
||||||
|
#if !WITHIN(SERIAL_PORT_3, -1, 3)
|
||||||
|
#error "SERIAL_PORT_3 must be from 0 to 3, or -1 for USB Serial."
|
||||||
|
#endif
|
||||||
|
#define MYSERIAL3 customizedSerial3
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DGUS_SERIAL_PORT
|
#ifdef MMU2_SERIAL_PORT
|
||||||
#if !WITHIN(DGUS_SERIAL_PORT, -1, 3)
|
#if !WITHIN(MMU2_SERIAL_PORT, -1, 3)
|
||||||
#error "DGUS_SERIAL_PORT must be from -1 to 3. Please update your configuration."
|
#error "MMU2_SERIAL_PORT must be from 0 to 3, or -1 for USB Serial."
|
||||||
#elif DGUS_SERIAL_PORT == SERIAL_PORT
|
|
||||||
#error "DGUS_SERIAL_PORT must be different than SERIAL_PORT. Please update your configuration."
|
|
||||||
#elif defined(SERIAL_PORT_2) && DGUS_SERIAL_PORT == SERIAL_PORT_2
|
|
||||||
#error "DGUS_SERIAL_PORT must be different than SERIAL_PORT_2. Please update your configuration."
|
|
||||||
#endif
|
#endif
|
||||||
#define DGUS_SERIAL internalDgusSerial
|
#define MMU2_SERIAL mmuSerial
|
||||||
|
|
||||||
#define DGUS_SERIAL_GET_TX_BUFFER_FREE DGUS_SERIAL.get_tx_buffer_free
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef ANYCUBIC_LCD_SERIAL_PORT
|
#ifdef LCD_SERIAL_PORT
|
||||||
#if !WITHIN(ANYCUBIC_LCD_SERIAL_PORT, -1, 3)
|
#if !WITHIN(LCD_SERIAL_PORT, -1, 3)
|
||||||
#error "ANYCUBIC_LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration."
|
#error "LCD_SERIAL_PORT must be from 0 to 3, or -1 for USB Serial."
|
||||||
#elif ANYCUBIC_LCD_SERIAL_PORT == SERIAL_PORT
|
#endif
|
||||||
#error "ANYCUBIC_LCD_SERIAL_PORT must be different than SERIAL_PORT. Please update your configuration."
|
#define LCD_SERIAL lcdSerial
|
||||||
#elif defined(SERIAL_PORT_2) && ANYCUBIC_LCD_SERIAL_PORT == SERIAL_PORT_2
|
#if HAS_DGUS_LCD
|
||||||
#error "ANYCUBIC_LCD_SERIAL_PORT must be different than SERIAL_PORT_2. Please update your configuration."
|
#define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.get_tx_buffer_free()
|
||||||
#endif
|
#endif
|
||||||
#define ANYCUBIC_LCD_SERIAL anycubicLcdSerial
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
@@ -144,12 +142,18 @@ void HAL_init();
|
|||||||
inline void HAL_clear_reset_source() { MCUSR = 0; }
|
inline void HAL_clear_reset_source() { MCUSR = 0; }
|
||||||
inline uint8_t HAL_get_reset_source() { return MCUSR; }
|
inline uint8_t HAL_get_reset_source() { return MCUSR; }
|
||||||
|
|
||||||
#pragma GCC diagnostic push
|
void HAL_reboot();
|
||||||
#pragma GCC diagnostic ignored "-Wunused-function"
|
|
||||||
extern "C" {
|
#if GCC_VERSION <= 50000
|
||||||
int freeMemory();
|
#pragma GCC diagnostic push
|
||||||
}
|
#pragma GCC diagnostic ignored "-Wunused-function"
|
||||||
#pragma GCC diagnostic pop
|
#endif
|
||||||
|
|
||||||
|
extern "C" int freeMemory();
|
||||||
|
|
||||||
|
#if GCC_VERSION <= 50000
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
|
||||||
// ADC
|
// ADC
|
||||||
#ifdef DIDR2
|
#ifdef DIDR2
|
||||||
|
|||||||
@@ -34,17 +34,17 @@
|
|||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
|
||||||
void spiBegin() {
|
void spiBegin() {
|
||||||
OUT_WRITE(SS_PIN, HIGH);
|
OUT_WRITE(SD_SS_PIN, HIGH);
|
||||||
SET_OUTPUT(SCK_PIN);
|
SET_OUTPUT(SD_SCK_PIN);
|
||||||
SET_INPUT(MISO_PIN);
|
SET_INPUT(SD_MISO_PIN);
|
||||||
SET_OUTPUT(MOSI_PIN);
|
SET_OUTPUT(SD_MOSI_PIN);
|
||||||
|
|
||||||
#if DISABLED(SOFTWARE_SPI)
|
#if DISABLED(SOFTWARE_SPI)
|
||||||
// SS must be in output mode even it is not chip select
|
// SS must be in output mode even it is not chip select
|
||||||
//SET_OUTPUT(SS_PIN);
|
//SET_OUTPUT(SD_SS_PIN);
|
||||||
// set SS high - may be chip select for another SPI device
|
// set SS high - may be chip select for another SPI device
|
||||||
//#if SET_SPI_SS_HIGH
|
//#if SET_SPI_SS_HIGH
|
||||||
//WRITE(SS_PIN, HIGH);
|
//WRITE(SD_SS_PIN, HIGH);
|
||||||
//#endif
|
//#endif
|
||||||
// set a default rate
|
// set a default rate
|
||||||
spiInit(1);
|
spiInit(1);
|
||||||
@@ -88,7 +88,7 @@ void spiBegin() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** SPI read data */
|
/** SPI read data */
|
||||||
void spiRead(uint8_t* buf, uint16_t nbyte) {
|
void spiRead(uint8_t *buf, uint16_t nbyte) {
|
||||||
if (nbyte-- == 0) return;
|
if (nbyte-- == 0) return;
|
||||||
SPDR = 0xFF;
|
SPDR = 0xFF;
|
||||||
for (uint16_t i = 0; i < nbyte; i++) {
|
for (uint16_t i = 0; i < nbyte; i++) {
|
||||||
@@ -107,7 +107,7 @@ void spiBegin() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** SPI send block */
|
/** SPI send block */
|
||||||
void spiSendBlock(uint8_t token, const uint8_t* buf) {
|
void spiSendBlock(uint8_t token, const uint8_t *buf) {
|
||||||
SPDR = token;
|
SPDR = token;
|
||||||
for (uint16_t i = 0; i < 512; i += 2) {
|
for (uint16_t i = 0; i < 512; i += 2) {
|
||||||
while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
|
while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
|
||||||
@@ -195,19 +195,19 @@ void spiBegin() {
|
|||||||
// no interrupts during byte receive - about 8µs
|
// no interrupts during byte receive - about 8µs
|
||||||
cli();
|
cli();
|
||||||
// output pin high - like sending 0xFF
|
// output pin high - like sending 0xFF
|
||||||
WRITE(MOSI_PIN, HIGH);
|
WRITE(SD_MOSI_PIN, HIGH);
|
||||||
|
|
||||||
LOOP_L_N(i, 8) {
|
LOOP_L_N(i, 8) {
|
||||||
WRITE(SCK_PIN, HIGH);
|
WRITE(SD_SCK_PIN, HIGH);
|
||||||
|
|
||||||
nop; // adjust so SCK is nice
|
nop; // adjust so SCK is nice
|
||||||
nop;
|
nop;
|
||||||
|
|
||||||
data <<= 1;
|
data <<= 1;
|
||||||
|
|
||||||
if (READ(MISO_PIN)) data |= 1;
|
if (READ(SD_MISO_PIN)) data |= 1;
|
||||||
|
|
||||||
WRITE(SCK_PIN, LOW);
|
WRITE(SD_SCK_PIN, LOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
sei();
|
sei();
|
||||||
@@ -215,7 +215,7 @@ void spiBegin() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Soft SPI read data
|
// Soft SPI read data
|
||||||
void spiRead(uint8_t* buf, uint16_t nbyte) {
|
void spiRead(uint8_t *buf, uint16_t nbyte) {
|
||||||
for (uint16_t i = 0; i < nbyte; i++)
|
for (uint16_t i = 0; i < nbyte; i++)
|
||||||
buf[i] = spiRec();
|
buf[i] = spiRec();
|
||||||
}
|
}
|
||||||
@@ -225,10 +225,10 @@ void spiBegin() {
|
|||||||
// no interrupts during byte send - about 8µs
|
// no interrupts during byte send - about 8µs
|
||||||
cli();
|
cli();
|
||||||
LOOP_L_N(i, 8) {
|
LOOP_L_N(i, 8) {
|
||||||
WRITE(SCK_PIN, LOW);
|
WRITE(SD_SCK_PIN, LOW);
|
||||||
WRITE(MOSI_PIN, data & 0x80);
|
WRITE(SD_MOSI_PIN, data & 0x80);
|
||||||
data <<= 1;
|
data <<= 1;
|
||||||
WRITE(SCK_PIN, HIGH);
|
WRITE(SD_SCK_PIN, HIGH);
|
||||||
}
|
}
|
||||||
|
|
||||||
nop; // hold SCK high for a few ns
|
nop; // hold SCK high for a few ns
|
||||||
@@ -236,13 +236,13 @@ void spiBegin() {
|
|||||||
nop;
|
nop;
|
||||||
nop;
|
nop;
|
||||||
|
|
||||||
WRITE(SCK_PIN, LOW);
|
WRITE(SD_SCK_PIN, LOW);
|
||||||
|
|
||||||
sei();
|
sei();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Soft SPI send block
|
// Soft SPI send block
|
||||||
void spiSendBlock(uint8_t token, const uint8_t* buf) {
|
void spiSendBlock(uint8_t token, const uint8_t *buf) {
|
||||||
spiSend(token);
|
spiSend(token);
|
||||||
for (uint16_t i = 0; i < 512; i++)
|
for (uint16_t i = 0; i < 512; i++)
|
||||||
spiSend(buf[i]);
|
spiSend(buf[i]);
|
||||||
|
|||||||
+518
-684
File diff suppressed because it is too large
Load Diff
@@ -34,6 +34,7 @@
|
|||||||
#include <WString.h>
|
#include <WString.h>
|
||||||
|
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
|
#include "../../core/serial_hook.h"
|
||||||
|
|
||||||
#ifndef SERIAL_PORT
|
#ifndef SERIAL_PORT
|
||||||
#define SERIAL_PORT 0
|
#define SERIAL_PORT 0
|
||||||
@@ -48,11 +49,11 @@
|
|||||||
|
|
||||||
// These are macros to build serial port register names for the selected SERIAL_PORT (C preprocessor
|
// These are macros to build serial port register names for the selected SERIAL_PORT (C preprocessor
|
||||||
// requires two levels of indirection to expand macro values properly)
|
// requires two levels of indirection to expand macro values properly)
|
||||||
#define SERIAL_REGNAME(registerbase,number,suffix) SERIAL_REGNAME_INTERNAL(registerbase,number,suffix)
|
#define SERIAL_REGNAME(registerbase,number,suffix) _SERIAL_REGNAME(registerbase,number,suffix)
|
||||||
#if SERIAL_PORT == 0 && (!defined(UBRR0H) || !defined(UDR0)) // use un-numbered registers if necessary
|
#if SERIAL_PORT == 0 && (!defined(UBRR0H) || !defined(UDR0)) // use un-numbered registers if necessary
|
||||||
#define SERIAL_REGNAME_INTERNAL(registerbase,number,suffix) registerbase##suffix
|
#define _SERIAL_REGNAME(registerbase,number,suffix) registerbase##suffix
|
||||||
#else
|
#else
|
||||||
#define SERIAL_REGNAME_INTERNAL(registerbase,number,suffix) registerbase##number##suffix
|
#define _SERIAL_REGNAME(registerbase,number,suffix) registerbase##number##suffix
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Registers used by MarlinSerial class (expanded depending on selected serial port)
|
// Registers used by MarlinSerial class (expanded depending on selected serial port)
|
||||||
@@ -135,10 +136,6 @@
|
|||||||
UART_DECL(3);
|
UART_DECL(3);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define DEC 10
|
|
||||||
#define HEX 16
|
|
||||||
#define OCT 8
|
|
||||||
#define BIN 2
|
|
||||||
#define BYTE 0
|
#define BYTE 0
|
||||||
|
|
||||||
// Templated type selector
|
// Templated type selector
|
||||||
@@ -202,58 +199,30 @@
|
|||||||
static FORCE_INLINE void atomic_set_rx_tail(ring_buffer_pos_t value);
|
static FORCE_INLINE void atomic_set_rx_tail(ring_buffer_pos_t value);
|
||||||
static FORCE_INLINE ring_buffer_pos_t atomic_read_rx_tail();
|
static FORCE_INLINE ring_buffer_pos_t atomic_read_rx_tail();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
FORCE_INLINE static void store_rxd_char();
|
FORCE_INLINE static void store_rxd_char();
|
||||||
FORCE_INLINE static void _tx_udr_empty_irq();
|
FORCE_INLINE static void _tx_udr_empty_irq();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MarlinSerial() {};
|
static void begin(const long);
|
||||||
static void begin(const long);
|
static void end();
|
||||||
static void end();
|
static int peek();
|
||||||
static int peek();
|
static int read();
|
||||||
static int read();
|
static void flush();
|
||||||
static void flush();
|
static ring_buffer_pos_t available();
|
||||||
static ring_buffer_pos_t available();
|
static void write(const uint8_t c);
|
||||||
static void write(const uint8_t c);
|
static void flushTX();
|
||||||
static void flushTX();
|
#if HAS_DGUS_LCD
|
||||||
#ifdef DGUS_SERIAL_PORT
|
static ring_buffer_pos_t get_tx_buffer_free();
|
||||||
static ring_buffer_pos_t get_tx_buffer_free();
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; }
|
enum { HasEmergencyParser = Cfg::EMERGENCYPARSER };
|
||||||
FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; }
|
static inline bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; }
|
||||||
FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; }
|
|
||||||
FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return Cfg::MAX_RX_QUEUED ? rx_max_enqueued : 0; }
|
|
||||||
|
|
||||||
FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); }
|
FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; }
|
||||||
FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); }
|
FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; }
|
||||||
FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); }
|
FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; }
|
||||||
FORCE_INLINE static void print(const char* str) { write(str); }
|
FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return Cfg::MAX_RX_QUEUED ? rx_max_enqueued : 0; }
|
||||||
|
|
||||||
static void print(char, int = BYTE);
|
|
||||||
static void print(unsigned char, int = BYTE);
|
|
||||||
static void print(int, int = DEC);
|
|
||||||
static void print(unsigned int, int = DEC);
|
|
||||||
static void print(long, int = DEC);
|
|
||||||
static void print(unsigned long, int = DEC);
|
|
||||||
static void print(double, int = 2);
|
|
||||||
|
|
||||||
static void println(const String& s);
|
|
||||||
static void println(const char[]);
|
|
||||||
static void println(char, int = BYTE);
|
|
||||||
static void println(unsigned char, int = BYTE);
|
|
||||||
static void println(int, int = DEC);
|
|
||||||
static void println(unsigned int, int = DEC);
|
|
||||||
static void println(long, int = DEC);
|
|
||||||
static void println(unsigned long, int = DEC);
|
|
||||||
static void println(double, int = 2);
|
|
||||||
static void println();
|
|
||||||
operator bool() { return true; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
static void printNumber(unsigned long, const uint8_t);
|
|
||||||
static void printFloat(double, uint8_t);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <uint8_t serial>
|
template <uint8_t serial>
|
||||||
@@ -268,68 +237,61 @@
|
|||||||
static constexpr bool RX_FRAMING_ERRORS = ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS);
|
static constexpr bool RX_FRAMING_ERRORS = ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS);
|
||||||
static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED);
|
static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED);
|
||||||
};
|
};
|
||||||
extern MarlinSerial<MarlinSerialCfg<SERIAL_PORT>> customizedSerial1;
|
|
||||||
|
typedef Serial1Class< MarlinSerial< MarlinSerialCfg<SERIAL_PORT> > > MSerialT1;
|
||||||
|
extern MSerialT1 customizedSerial1;
|
||||||
|
|
||||||
#ifdef SERIAL_PORT_2
|
#ifdef SERIAL_PORT_2
|
||||||
|
typedef Serial1Class< MarlinSerial< MarlinSerialCfg<SERIAL_PORT_2> > > MSerialT2;
|
||||||
|
extern MSerialT2 customizedSerial2;
|
||||||
|
#endif
|
||||||
|
|
||||||
extern MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>> customizedSerial2;
|
#ifdef SERIAL_PORT_3
|
||||||
|
typedef Serial1Class< MarlinSerial< MarlinSerialCfg<SERIAL_PORT_3> > > MSerialT3;
|
||||||
|
extern MSerialT3 customizedSerial3;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // !USBCON
|
#endif // !USBCON
|
||||||
|
|
||||||
#ifdef INTERNAL_SERIAL_PORT
|
#ifdef MMU2_SERIAL_PORT
|
||||||
template <uint8_t serial>
|
template <uint8_t serial>
|
||||||
struct MarlinInternalSerialCfg {
|
struct MMU2SerialCfg {
|
||||||
static constexpr int PORT = serial;
|
static constexpr int PORT = serial;
|
||||||
static constexpr unsigned int RX_SIZE = 32;
|
static constexpr unsigned int RX_SIZE = 32;
|
||||||
static constexpr unsigned int TX_SIZE = 32;
|
static constexpr unsigned int TX_SIZE = 32;
|
||||||
static constexpr bool XONOFF = false;
|
static constexpr bool XONOFF = false;
|
||||||
static constexpr bool EMERGENCYPARSER = false;
|
static constexpr bool EMERGENCYPARSER = false;
|
||||||
static constexpr bool DROPPED_RX = false;
|
static constexpr bool DROPPED_RX = false;
|
||||||
static constexpr bool RX_OVERRUNS = false;
|
|
||||||
static constexpr bool RX_FRAMING_ERRORS = false;
|
static constexpr bool RX_FRAMING_ERRORS = false;
|
||||||
static constexpr bool MAX_RX_QUEUED = false;
|
static constexpr bool MAX_RX_QUEUED = false;
|
||||||
|
static constexpr bool RX_OVERRUNS = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern MarlinSerial<MarlinInternalSerialCfg<INTERNAL_SERIAL_PORT>> internalSerial;
|
typedef Serial1Class< MarlinSerial< MMU2SerialCfg<MMU2_SERIAL_PORT> > > MSerialMMU2;
|
||||||
|
extern MSerialMMU2 mmuSerial;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DGUS_SERIAL_PORT
|
#ifdef LCD_SERIAL_PORT
|
||||||
|
|
||||||
template <uint8_t serial>
|
template <uint8_t serial>
|
||||||
struct MarlinInternalSerialCfg {
|
struct LCDSerialCfg {
|
||||||
static constexpr int PORT = serial;
|
static constexpr int PORT = serial;
|
||||||
static constexpr unsigned int RX_SIZE = DGUS_RX_BUFFER_SIZE;
|
static constexpr unsigned int RX_SIZE = TERN(HAS_DGUS_LCD, DGUS_RX_BUFFER_SIZE, 64);
|
||||||
static constexpr unsigned int TX_SIZE = DGUS_TX_BUFFER_SIZE;
|
static constexpr unsigned int TX_SIZE = TERN(HAS_DGUS_LCD, DGUS_TX_BUFFER_SIZE, 128);
|
||||||
static constexpr bool XONOFF = false;
|
static constexpr bool XONOFF = false;
|
||||||
static constexpr bool EMERGENCYPARSER = false;
|
static constexpr bool EMERGENCYPARSER = ENABLED(EMERGENCY_PARSER);
|
||||||
static constexpr bool DROPPED_RX = false;
|
static constexpr bool DROPPED_RX = false;
|
||||||
static constexpr bool RX_OVERRUNS = BOTH(HAS_DGUS_LCD, DGUS_SERIAL_STATS_RX_BUFFER_OVERRUNS);
|
|
||||||
static constexpr bool RX_FRAMING_ERRORS = false;
|
static constexpr bool RX_FRAMING_ERRORS = false;
|
||||||
static constexpr bool MAX_RX_QUEUED = false;
|
static constexpr bool MAX_RX_QUEUED = false;
|
||||||
|
static constexpr bool RX_OVERRUNS = BOTH(HAS_DGUS_LCD, SERIAL_STATS_RX_BUFFER_OVERRUNS);
|
||||||
};
|
};
|
||||||
|
|
||||||
extern MarlinSerial<MarlinInternalSerialCfg<DGUS_SERIAL_PORT>> internalDgusSerial;
|
typedef Serial1Class< MarlinSerial< LCDSerialCfg<LCD_SERIAL_PORT> > > MSerialLCD;
|
||||||
#endif
|
extern MSerialLCD lcdSerial;
|
||||||
|
|
||||||
#ifdef ANYCUBIC_LCD_SERIAL_PORT
|
|
||||||
template <uint8_t serial>
|
|
||||||
struct AnycubicLcdSerialCfg {
|
|
||||||
static constexpr int PORT = serial;
|
|
||||||
static constexpr unsigned int RX_SIZE = 64;
|
|
||||||
static constexpr unsigned int TX_SIZE = 128;
|
|
||||||
static constexpr bool XONOFF = false;
|
|
||||||
static constexpr bool EMERGENCYPARSER = false;
|
|
||||||
static constexpr bool DROPPED_RX = false;
|
|
||||||
static constexpr bool RX_OVERRUNS = false;
|
|
||||||
static constexpr bool RX_FRAMING_ERRORS = false;
|
|
||||||
static constexpr bool MAX_RX_QUEUED = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern MarlinSerial<AnycubicLcdSerialCfg<ANYCUBIC_LCD_SERIAL_PORT>> anycubicLcdSerial;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Use the UART for Bluetooth in AT90USB configurations
|
// Use the UART for Bluetooth in AT90USB configurations
|
||||||
#if defined(USBCON) && ENABLED(BLUETOOTH)
|
#if defined(USBCON) && ENABLED(BLUETOOTH)
|
||||||
extern HardwareSerial bluetoothSerial;
|
typedef Serial1Class<HardwareSerial> MSerialBT;
|
||||||
|
extern MSerialBT bluetoothSerial;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -48,7 +48,6 @@
|
|||||||
* readMicroseconds() - Get the last-written servo pulse width in microseconds.
|
* readMicroseconds() - Get the last-written servo pulse width in microseconds.
|
||||||
* attached() - Return true if a servo is attached.
|
* attached() - Return true if a servo is attached.
|
||||||
* detach() - Stop an attached servo from pulsing its i/o pin.
|
* detach() - Stop an attached servo from pulsing its i/o pin.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __AVR__
|
#ifdef __AVR__
|
||||||
|
|||||||
@@ -59,10 +59,12 @@
|
|||||||
// Say which 16 bit timers can be used and in what order
|
// Say which 16 bit timers can be used and in what order
|
||||||
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||||
//#define _useTimer1
|
//#define _useTimer1
|
||||||
#define _useTimer3
|
|
||||||
#define _useTimer4
|
#define _useTimer4
|
||||||
#if !HAS_MOTOR_CURRENT_PWM
|
#if NUM_SERVOS > SERVOS_PER_TIMER
|
||||||
#define _useTimer5 // Timer 5 is used for motor current PWM and can't be used for servos.
|
#define _useTimer3
|
||||||
|
#if !HAS_MOTOR_CURRENT_PWM && SERVOS > 2 * SERVOS_PER_TIMER
|
||||||
|
#define _useTimer5 // Timer 5 is used for motor current PWM and can't be used for servos.
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#elif defined(__AVR_ATmega32U4__)
|
#elif defined(__AVR_ATmega32U4__)
|
||||||
#define _useTimer3
|
#define _useTimer3
|
||||||
|
|||||||
@@ -40,13 +40,13 @@ bool PersistentStore::access_start() { return true; }
|
|||||||
bool PersistentStore::access_finish() { return true; }
|
bool PersistentStore::access_finish() { return true; }
|
||||||
|
|
||||||
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
||||||
|
uint16_t written = 0;
|
||||||
while (size--) {
|
while (size--) {
|
||||||
uint8_t * const p = (uint8_t * const)pos;
|
uint8_t * const p = (uint8_t * const)pos;
|
||||||
uint8_t v = *value;
|
uint8_t v = *value;
|
||||||
// EEPROM has only ~100,000 write cycles,
|
if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed!
|
||||||
// so only write bytes that have changed!
|
|
||||||
if (v != eeprom_read_byte(p)) {
|
|
||||||
eeprom_write_byte(p, v);
|
eeprom_write_byte(p, v);
|
||||||
|
if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes
|
||||||
if (eeprom_read_byte(p) != v) {
|
if (eeprom_read_byte(p) != v) {
|
||||||
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
||||||
return true;
|
return true;
|
||||||
@@ -59,7 +59,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
||||||
do {
|
do {
|
||||||
uint8_t c = eeprom_read_byte((uint8_t*)pos);
|
uint8_t c = eeprom_read_byte((uint8_t*)pos);
|
||||||
if (writing) *value = c;
|
if (writing) *value = c;
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(X_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(X_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(X_MAX_PIN);
|
_ATTACH(X_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(X_MAX_PIN), "X_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(X_MAX_PIN), "X_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(X_MAX_PIN);
|
pciSetup(X_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -132,7 +132,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(X_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(X_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(X_MIN_PIN);
|
_ATTACH(X_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(X_MIN_PIN), "X_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(X_MIN_PIN), "X_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(X_MIN_PIN);
|
pciSetup(X_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -140,7 +140,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Y_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Y_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Y_MAX_PIN);
|
_ATTACH(Y_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Y_MAX_PIN), "Y_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Y_MAX_PIN), "Y_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Y_MAX_PIN);
|
pciSetup(Y_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -148,7 +148,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Y_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Y_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Y_MIN_PIN);
|
_ATTACH(Y_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Y_MIN_PIN), "Y_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Y_MIN_PIN), "Y_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Y_MIN_PIN);
|
pciSetup(Y_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -156,7 +156,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z_MAX_PIN);
|
_ATTACH(Z_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z_MAX_PIN), "Z_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z_MAX_PIN), "Z_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z_MAX_PIN);
|
pciSetup(Z_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -164,15 +164,60 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z_MIN_PIN);
|
_ATTACH(Z_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z_MIN_PIN), "Z_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z_MIN_PIN), "Z_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z_MIN_PIN);
|
pciSetup(Z_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#if HAS_I_MAX
|
||||||
|
#if (digitalPinToInterrupt(I_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
|
_ATTACH(I_MAX_PIN);
|
||||||
|
#else
|
||||||
|
static_assert(digitalPinHasPCICR(I_MAX_PIN), "I_MAX_PIN is not interrupt-capable");
|
||||||
|
pciSetup(I_MAX_PIN);
|
||||||
|
#endif
|
||||||
|
#elif HAS_I_MIN
|
||||||
|
#if (digitalPinToInterrupt(I_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
|
_ATTACH(I_MIN_PIN);
|
||||||
|
#else
|
||||||
|
static_assert(digitalPinHasPCICR(I_MIN_PIN), "I_MIN_PIN is not interrupt-capable");
|
||||||
|
pciSetup(I_MIN_PIN);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#if HAS_J_MAX
|
||||||
|
#if (digitalPinToInterrupt(J_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
|
_ATTACH(J_MAX_PIN);
|
||||||
|
#else
|
||||||
|
static_assert(digitalPinHasPCICR(J_MAX_PIN), "J_MAX_PIN is not interrupt-capable");
|
||||||
|
pciSetup(J_MAX_PIN);
|
||||||
|
#endif
|
||||||
|
#elif HAS_J_MIN
|
||||||
|
#if (digitalPinToInterrupt(J_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
|
_ATTACH(J_MIN_PIN);
|
||||||
|
#else
|
||||||
|
static_assert(digitalPinHasPCICR(J_MIN_PIN), "J_MIN_PIN is not interrupt-capable");
|
||||||
|
pciSetup(J_MIN_PIN);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#if HAS_K_MAX
|
||||||
|
#if (digitalPinToInterrupt(K_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
|
_ATTACH(K_MAX_PIN);
|
||||||
|
#else
|
||||||
|
static_assert(digitalPinHasPCICR(K_MAX_PIN), "K_MAX_PIN is not interrupt-capable");
|
||||||
|
pciSetup(K_MAX_PIN);
|
||||||
|
#endif
|
||||||
|
#elif HAS_K_MIN
|
||||||
|
#if (digitalPinToInterrupt(K_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
|
_ATTACH(K_MIN_PIN);
|
||||||
|
#else
|
||||||
|
static_assert(digitalPinHasPCICR(K_MIN_PIN), "K_MIN_PIN is not interrupt-capable");
|
||||||
|
pciSetup(K_MIN_PIN);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
#if HAS_X2_MAX
|
#if HAS_X2_MAX
|
||||||
#if (digitalPinToInterrupt(X2_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(X2_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(X2_MAX_PIN);
|
_ATTACH(X2_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(X2_MAX_PIN), "X2_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(X2_MAX_PIN), "X2_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(X2_MAX_PIN);
|
pciSetup(X2_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -180,7 +225,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(X2_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(X2_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(X2_MIN_PIN);
|
_ATTACH(X2_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(X2_MIN_PIN), "X2_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(X2_MIN_PIN), "X2_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(X2_MIN_PIN);
|
pciSetup(X2_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -188,7 +233,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Y2_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Y2_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Y2_MAX_PIN);
|
_ATTACH(Y2_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Y2_MAX_PIN), "Y2_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Y2_MAX_PIN), "Y2_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Y2_MAX_PIN);
|
pciSetup(Y2_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -196,7 +241,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Y2_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Y2_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Y2_MIN_PIN);
|
_ATTACH(Y2_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Y2_MIN_PIN), "Y2_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Y2_MIN_PIN), "Y2_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Y2_MIN_PIN);
|
pciSetup(Y2_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -204,7 +249,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z2_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z2_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z2_MAX_PIN);
|
_ATTACH(Z2_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z2_MAX_PIN), "Z2_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z2_MAX_PIN), "Z2_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z2_MAX_PIN);
|
pciSetup(Z2_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -212,7 +257,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z2_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z2_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z2_MIN_PIN);
|
_ATTACH(Z2_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z2_MIN_PIN), "Z2_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z2_MIN_PIN), "Z2_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z2_MIN_PIN);
|
pciSetup(Z2_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -220,7 +265,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z3_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z3_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z3_MAX_PIN);
|
_ATTACH(Z3_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z3_MAX_PIN), "Z3_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z3_MAX_PIN), "Z3_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z3_MAX_PIN);
|
pciSetup(Z3_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -228,7 +273,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z3_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z3_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z3_MIN_PIN);
|
_ATTACH(Z3_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z3_MIN_PIN), "Z3_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z3_MIN_PIN), "Z3_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z3_MIN_PIN);
|
pciSetup(Z3_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -236,7 +281,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z4_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z4_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z4_MAX_PIN);
|
_ATTACH(Z4_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z4_MAX_PIN), "Z4_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z4_MAX_PIN), "Z4_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z4_MAX_PIN);
|
pciSetup(Z4_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -244,7 +289,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z4_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z4_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z4_MIN_PIN);
|
_ATTACH(Z4_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z4_MIN_PIN), "Z4_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z4_MIN_PIN), "Z4_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z4_MIN_PIN);
|
pciSetup(Z4_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -252,10 +297,9 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z_MIN_PROBE_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z_MIN_PROBE_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z_MIN_PROBE_PIN);
|
_ATTACH(Z_MIN_PROBE_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z_MIN_PROBE_PIN), "Z_MIN_PROBE_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z_MIN_PROBE_PIN), "Z_MIN_PROBE_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z_MIN_PROBE_PIN);
|
pciSetup(Z_MIN_PROBE_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// If we arrive here without raising an assertion, each pin has either an EXT-interrupt or a PCI.
|
// If we arrive here without raising an assertion, each pin has either an EXT-interrupt or a PCI.
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -185,8 +185,8 @@ void set_pwm_frequency(const pin_t pin, int f_desired) {
|
|||||||
res_temp_phase_correct = rtf / 2;
|
res_temp_phase_correct = rtf / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
LIMIT(res_temp_fast, 1u, size);
|
LIMIT(res_temp_fast, 1U, size);
|
||||||
LIMIT(res_temp_phase_correct, 1u, size);
|
LIMIT(res_temp_phase_correct, 1U, size);
|
||||||
// Calculate frequencies of test prescaler and resolution values
|
// Calculate frequencies of test prescaler and resolution values
|
||||||
const int f_temp_fast = (F_CPU) / (prescaler[i] * (1 + res_temp_fast)),
|
const int f_temp_fast = (F_CPU) / (prescaler[i] * (1 + res_temp_fast)),
|
||||||
f_temp_phase_correct = (F_CPU) / (2 * prescaler[i] * res_temp_phase_correct),
|
f_temp_phase_correct = (F_CPU) / (2 * prescaler[i] * res_temp_phase_correct),
|
||||||
|
|||||||
@@ -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 &hz, const float dca, const float dcb, const float dcc) {
|
uint16_t set_pwm_frequency_hz(const_float_t 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.
|
||||||
|
|||||||
@@ -29,11 +29,17 @@
|
|||||||
|
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
|
|
||||||
#define AVR_AT90USB1286_FAMILY (defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1286P__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB646P__) || defined(__AVR_AT90USB647__))
|
#if defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1286P__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB646P__) || defined(__AVR_AT90USB647__)
|
||||||
#define AVR_ATmega1284_FAMILY (defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284P__))
|
#define AVR_AT90USB1286_FAMILY 1
|
||||||
#define AVR_ATmega2560_FAMILY (defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__))
|
#elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284P__)
|
||||||
#define AVR_ATmega2561_FAMILY (defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__))
|
#define AVR_ATmega1284_FAMILY 1
|
||||||
#define AVR_ATmega328_FAMILY (defined(__AVR_ATmega168__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__))
|
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||||
|
#define AVR_ATmega2560_FAMILY 1
|
||||||
|
#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)
|
||||||
|
#define AVR_ATmega2561_FAMILY 1
|
||||||
|
#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__)
|
||||||
|
#define AVR_ATmega328_FAMILY 1
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Include Ports and Functions
|
* Include Ports and Functions
|
||||||
@@ -279,7 +285,7 @@ enum ClockSource2 : char {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// Determine which harware PWMs are already in use
|
// Determine which harware PWMs are already in use
|
||||||
#define _PWM_CHK_FAN_B(P) (P == E0_AUTO_FAN_PIN || P == E1_AUTO_FAN_PIN || P == E2_AUTO_FAN_PIN || P == E3_AUTO_FAN_PIN || P == E4_AUTO_FAN_PIN || P == E5_AUTO_FAN_PIN || P == E6_AUTO_FAN_PIN || P == E7_AUTO_FAN_PIN || P == CHAMBER_AUTO_FAN_PIN)
|
#define _PWM_CHK_FAN_B(P) (P == E0_AUTO_FAN_PIN || P == E1_AUTO_FAN_PIN || P == E2_AUTO_FAN_PIN || P == E3_AUTO_FAN_PIN || P == E4_AUTO_FAN_PIN || P == E5_AUTO_FAN_PIN || P == E6_AUTO_FAN_PIN || P == E7_AUTO_FAN_PIN || P == CHAMBER_AUTO_FAN_PIN || P == COOLER_AUTO_FAN_PIN)
|
||||||
#if PIN_EXISTS(CONTROLLER_FAN)
|
#if PIN_EXISTS(CONTROLLER_FAN)
|
||||||
#define PWM_CHK_FAN_B(P) (_PWM_CHK_FAN_B(P) || P == CONTROLLER_FAN_PIN)
|
#define PWM_CHK_FAN_B(P) (_PWM_CHK_FAN_B(P) || P == CONTROLLER_FAN_PIN)
|
||||||
#else
|
#else
|
||||||
|
|||||||
@@ -36,9 +36,10 @@
|
|||||||
* Sanity checks for Spindle / Laser PWM
|
* Sanity checks for Spindle / Laser PWM
|
||||||
*/
|
*/
|
||||||
#if ENABLED(SPINDLE_LASER_PWM)
|
#if ENABLED(SPINDLE_LASER_PWM)
|
||||||
|
#include "../ServoTimers.h" // Needed to check timer availability (_useTimer3)
|
||||||
#if SPINDLE_LASER_PWM_PIN == 4 || WITHIN(SPINDLE_LASER_PWM_PIN, 11, 13)
|
#if SPINDLE_LASER_PWM_PIN == 4 || WITHIN(SPINDLE_LASER_PWM_PIN, 11, 13)
|
||||||
#error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by a system interrupt."
|
#error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by a system interrupt."
|
||||||
#elif NUM_SERVOS > 0 && (WITHIN(SPINDLE_LASER_PWM_PIN, 2, 3) || SPINDLE_LASER_PWM_PIN == 5)
|
#elif NUM_SERVOS > 0 && defined(_useTimer3) && (WITHIN(SPINDLE_LASER_PWM_PIN, 2, 3) || SPINDLE_LASER_PWM_PIN == 5)
|
||||||
#error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by the servo system."
|
#error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by the servo system."
|
||||||
#endif
|
#endif
|
||||||
#elif defined(SPINDLE_LASER_FREQUENCY)
|
#elif defined(SPINDLE_LASER_FREQUENCY)
|
||||||
@@ -55,3 +56,10 @@
|
|||||||
#if BOTH(HAS_TMC_SW_SERIAL, MONITOR_DRIVER_STATUS)
|
#if BOTH(HAS_TMC_SW_SERIAL, MONITOR_DRIVER_STATUS)
|
||||||
#error "MONITOR_DRIVER_STATUS causes performance issues when used with SoftwareSerial-connected drivers. Disable MONITOR_DRIVER_STATUS or use hardware serial to continue."
|
#error "MONITOR_DRIVER_STATUS causes performance issues when used with SoftwareSerial-connected drivers. Disable MONITOR_DRIVER_STATUS or use hardware serial to continue."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Postmortem debugging
|
||||||
|
*/
|
||||||
|
#if ENABLED(POSTMORTEM_DEBUGGING)
|
||||||
|
#error "POSTMORTEM_DEBUGGING is not supported on AVR boards."
|
||||||
|
#endif
|
||||||
|
|||||||
@@ -26,7 +26,9 @@
|
|||||||
|
|
||||||
#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS
|
#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS
|
||||||
|
|
||||||
#define AVR_ATmega2560_FAMILY_PLUS_70 MB(BQ_ZUM_MEGA_3D, MIGHTYBOARD_REVE, MINIRAMBO, SCOOVO_X9H)
|
#if MB(BQ_ZUM_MEGA_3D, MIGHTYBOARD_REVE, MINIRAMBO, SCOOVO_X9H, TRIGORILLA_14)
|
||||||
|
#define AVR_ATmega2560_FAMILY_PLUS_70 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#if AVR_AT90USB1286_FAMILY
|
#if AVR_AT90USB1286_FAMILY
|
||||||
|
|
||||||
@@ -36,7 +38,7 @@
|
|||||||
// 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_Teensy(p)
|
#define digitalPinToPort_DEBUG(p) digitalPinToPort(p)
|
||||||
#define GET_PINMODE(pin) (*portModeRegister(pin) & digitalPinToBitMask_DEBUG(pin))
|
#define GET_PINMODE(pin) (*portModeRegister(pin) & digitalPinToBitMask_DEBUG(pin))
|
||||||
|
|
||||||
#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
|
||||||
@@ -233,8 +235,8 @@ static void print_is_also_tied() { SERIAL_ECHOPGM(" is also tied to this pin");
|
|||||||
|
|
||||||
inline void com_print(const uint8_t N, const uint8_t Z) {
|
inline void com_print(const uint8_t N, const uint8_t Z) {
|
||||||
const uint8_t *TCCRA = (uint8_t*)TCCR_A(N);
|
const uint8_t *TCCRA = (uint8_t*)TCCR_A(N);
|
||||||
SERIAL_ECHOPGM(" COM");
|
SERIAL_ECHOPAIR(" COM", AS_CHAR('0' + N));
|
||||||
SERIAL_CHAR('0' + N, Z);
|
SERIAL_CHAR(Z);
|
||||||
SERIAL_ECHOPAIR(": ", int((*TCCRA >> (6 - Z * 2)) & 0x03));
|
SERIAL_ECHOPAIR(": ", int((*TCCRA >> (6 - Z * 2)) & 0x03));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -245,8 +247,8 @@ void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N -
|
|||||||
uint8_t WGM = (((*TCCRB & _BV(WGM_2)) >> 1) | (*TCCRA & (_BV(WGM_0) | _BV(WGM_1))));
|
uint8_t WGM = (((*TCCRB & _BV(WGM_2)) >> 1) | (*TCCRA & (_BV(WGM_0) | _BV(WGM_1))));
|
||||||
if (N == 4) WGM |= ((*TCCRB & _BV(WGM_3)) >> 1);
|
if (N == 4) WGM |= ((*TCCRB & _BV(WGM_3)) >> 1);
|
||||||
|
|
||||||
SERIAL_ECHOPGM(" TIMER");
|
SERIAL_ECHOPAIR(" TIMER", AS_CHAR(T + '0'));
|
||||||
SERIAL_CHAR(T + '0', L);
|
SERIAL_CHAR(L);
|
||||||
SERIAL_ECHO_SP(3);
|
SERIAL_ECHO_SP(3);
|
||||||
|
|
||||||
if (N == 3) {
|
if (N == 3) {
|
||||||
@@ -260,19 +262,11 @@ void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N -
|
|||||||
SERIAL_ECHOPAIR(" WGM: ", WGM);
|
SERIAL_ECHOPAIR(" WGM: ", WGM);
|
||||||
com_print(T,L);
|
com_print(T,L);
|
||||||
SERIAL_ECHOPAIR(" CS: ", (*TCCRB & (_BV(CS_0) | _BV(CS_1) | _BV(CS_2)) ));
|
SERIAL_ECHOPAIR(" CS: ", (*TCCRB & (_BV(CS_0) | _BV(CS_1) | _BV(CS_2)) ));
|
||||||
|
SERIAL_ECHOPAIR(" TCCR", AS_CHAR(T + '0'), "A: ", *TCCRA);
|
||||||
SERIAL_ECHOPGM(" TCCR");
|
SERIAL_ECHOPAIR(" TCCR", AS_CHAR(T + '0'), "B: ", *TCCRB);
|
||||||
SERIAL_CHAR(T + '0');
|
|
||||||
SERIAL_ECHOPAIR("A: ", *TCCRA);
|
|
||||||
|
|
||||||
SERIAL_ECHOPGM(" TCCR");
|
|
||||||
SERIAL_CHAR(T + '0');
|
|
||||||
SERIAL_ECHOPAIR("B: ", *TCCRB);
|
|
||||||
|
|
||||||
const uint8_t *TMSK = (uint8_t*)TIMSK(T);
|
const uint8_t *TMSK = (uint8_t*)TIMSK(T);
|
||||||
SERIAL_ECHOPGM(" TIMSK");
|
SERIAL_ECHOPAIR(" TIMSK", AS_CHAR(T + '0'), ": ", *TMSK);
|
||||||
SERIAL_CHAR(T + '0');
|
|
||||||
SERIAL_ECHOPAIR(": ", *TMSK);
|
|
||||||
|
|
||||||
const uint8_t OCIE = L - 'A' + 1;
|
const uint8_t OCIE = L - 'A' + 1;
|
||||||
if (N == 3) { if (WGM == 0 || WGM == 2 || WGM == 4 || WGM == 6) err_is_counter(); }
|
if (N == 3) { if (WGM == 0 || WGM == 2 || WGM == 4 || WGM == 6) err_is_counter(); }
|
||||||
|
|||||||
@@ -22,15 +22,12 @@
|
|||||||
* Structures for 2560 family boards that use more than 70 pins
|
* Structures for 2560 family boards that use more than 70 pins
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#undef NUM_DIGITAL_PINS
|
#if MB(BQ_ZUM_MEGA_3D, MINIRAMBO, SCOOVO_X9H, TRIGORILLA_14)
|
||||||
#if MB(BQ_ZUM_MEGA_3D)
|
#undef NUM_DIGITAL_PINS
|
||||||
#define NUM_DIGITAL_PINS 85
|
#define NUM_DIGITAL_PINS 85
|
||||||
#elif MB(MIGHTYBOARD_REVE)
|
#elif MB(MIGHTYBOARD_REVE)
|
||||||
|
#undef NUM_DIGITAL_PINS
|
||||||
#define NUM_DIGITAL_PINS 80
|
#define NUM_DIGITAL_PINS 80
|
||||||
#elif MB(MINIRAMBO)
|
|
||||||
#define NUM_DIGITAL_PINS 85
|
|
||||||
#elif MB(SCOOVO_X9H)
|
|
||||||
#define NUM_DIGITAL_PINS 85
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define PA 1
|
#define PA 1
|
||||||
|
|||||||
@@ -51,15 +51,15 @@
|
|||||||
#define AVR_SS_PIN 16
|
#define AVR_SS_PIN 16
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef SCK_PIN
|
#ifndef SD_SCK_PIN
|
||||||
#define SCK_PIN AVR_SCK_PIN
|
#define SD_SCK_PIN AVR_SCK_PIN
|
||||||
#endif
|
#endif
|
||||||
#ifndef MISO_PIN
|
#ifndef SD_MISO_PIN
|
||||||
#define MISO_PIN AVR_MISO_PIN
|
#define SD_MISO_PIN AVR_MISO_PIN
|
||||||
#endif
|
#endif
|
||||||
#ifndef MOSI_PIN
|
#ifndef SD_MOSI_PIN
|
||||||
#define MOSI_PIN AVR_MOSI_PIN
|
#define SD_MOSI_PIN AVR_MOSI_PIN
|
||||||
#endif
|
#endif
|
||||||
#ifndef SS_PIN
|
#ifndef SD_SS_PIN
|
||||||
#define SS_PIN AVR_SS_PIN
|
#define SD_SS_PIN AVR_SS_PIN
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* 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
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -57,7 +57,7 @@
|
|||||||
|
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
#if HAS_GRAPHICAL_LCD
|
#if HAS_MARLINUI_U8GLIB
|
||||||
|
|
||||||
#include "../shared/Marduino.h"
|
#include "../shared/Marduino.h"
|
||||||
#include "../shared/Delay.h"
|
#include "../shared/Delay.h"
|
||||||
@@ -189,5 +189,5 @@ uint8_t u8g_com_HAL_AVR_sw_sp_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // HAS_GRAPHICAL_LCD
|
#endif // HAS_MARLINUI_U8GLIB
|
||||||
#endif // ARDUINO_ARCH_SAM
|
#endif // ARDUINO_ARCH_SAM
|
||||||
|
|||||||
@@ -1,342 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifdef ARDUINO_ARCH_SAM
|
|
||||||
|
|
||||||
#include "../../core/macros.h"
|
|
||||||
#include "../../core/serial.h"
|
|
||||||
|
|
||||||
#include "../shared/backtrace/unwinder.h"
|
|
||||||
#include "../shared/backtrace/unwmemaccess.h"
|
|
||||||
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
// Debug monitor that dumps to the Programming port all status when
|
|
||||||
// an exception or WDT timeout happens - And then resets the board
|
|
||||||
|
|
||||||
// All the Monitor routines must run with interrupts disabled and
|
|
||||||
// under an ISR execution context. That is why we cannot reuse the
|
|
||||||
// Serial interrupt routines or any C runtime, as we don't know the
|
|
||||||
// state we are when running them
|
|
||||||
|
|
||||||
// A SW memory barrier, to ensure GCC does not overoptimize loops
|
|
||||||
#define sw_barrier() __asm__ volatile("": : :"memory");
|
|
||||||
|
|
||||||
// (re)initialize UART0 as a monitor output to 250000,n,8,1
|
|
||||||
static void TXBegin() {
|
|
||||||
|
|
||||||
// Disable UART interrupt in NVIC
|
|
||||||
NVIC_DisableIRQ( UART_IRQn );
|
|
||||||
|
|
||||||
// We NEED memory barriers to ensure Interrupts are actually disabled!
|
|
||||||
// ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the )
|
|
||||||
__DSB();
|
|
||||||
__ISB();
|
|
||||||
|
|
||||||
// Disable clock
|
|
||||||
pmc_disable_periph_clk( ID_UART );
|
|
||||||
|
|
||||||
// Configure PMC
|
|
||||||
pmc_enable_periph_clk( ID_UART );
|
|
||||||
|
|
||||||
// Disable PDC channel
|
|
||||||
UART->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS;
|
|
||||||
|
|
||||||
// Reset and disable receiver and transmitter
|
|
||||||
UART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS;
|
|
||||||
|
|
||||||
// Configure mode: 8bit, No parity, 1 bit stop
|
|
||||||
UART->UART_MR = UART_MR_CHMODE_NORMAL | US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_NO;
|
|
||||||
|
|
||||||
// Configure baudrate (asynchronous, no oversampling) to BAUDRATE bauds
|
|
||||||
UART->UART_BRGR = (SystemCoreClock / (BAUDRATE << 4));
|
|
||||||
|
|
||||||
// Enable receiver and transmitter
|
|
||||||
UART->UART_CR = UART_CR_RXEN | UART_CR_TXEN;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send character through UART with no interrupts
|
|
||||||
static void TX(char c) {
|
|
||||||
while (!(UART->UART_SR & UART_SR_TXRDY)) { WDT_Restart(WDT); sw_barrier(); };
|
|
||||||
UART->UART_THR = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send String through UART
|
|
||||||
static void TX(const char* s) {
|
|
||||||
while (*s) TX(*s++);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void TXDigit(uint32_t d) {
|
|
||||||
if (d < 10) TX((char)(d+'0'));
|
|
||||||
else if (d < 16) TX((char)(d+'A'-10));
|
|
||||||
else TX('?');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send Hex number thru UART
|
|
||||||
static void TXHex(uint32_t v) {
|
|
||||||
TX("0x");
|
|
||||||
for (uint8_t i = 0; i < 8; i++, v <<= 4)
|
|
||||||
TXDigit((v >> 28) & 0xF);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send Decimal number thru UART
|
|
||||||
static void TXDec(uint32_t v) {
|
|
||||||
if (!v) {
|
|
||||||
TX('0');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
char nbrs[14];
|
|
||||||
char *p = &nbrs[0];
|
|
||||||
while (v != 0) {
|
|
||||||
*p++ = '0' + (v % 10);
|
|
||||||
v /= 10;
|
|
||||||
}
|
|
||||||
do {
|
|
||||||
p--;
|
|
||||||
TX(*p);
|
|
||||||
} while (p != &nbrs[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dump a backtrace entry
|
|
||||||
static bool UnwReportOut(void* ctx, const UnwReport* bte) {
|
|
||||||
int* p = (int*)ctx;
|
|
||||||
|
|
||||||
(*p)++;
|
|
||||||
TX('#'); TXDec(*p); TX(" : ");
|
|
||||||
TX(bte->name?bte->name:"unknown"); TX('@'); TXHex(bte->function);
|
|
||||||
TX('+'); TXDec(bte->address - bte->function);
|
|
||||||
TX(" PC:");TXHex(bte->address); TX('\n');
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef UNW_DEBUG
|
|
||||||
void UnwPrintf(const char* format, ...) {
|
|
||||||
char dest[256];
|
|
||||||
va_list argptr;
|
|
||||||
va_start(argptr, format);
|
|
||||||
vsprintf(dest, format, argptr);
|
|
||||||
va_end(argptr);
|
|
||||||
TX(&dest[0]);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Table of function pointers for passing to the unwinder */
|
|
||||||
static const UnwindCallbacks UnwCallbacks = {
|
|
||||||
UnwReportOut,
|
|
||||||
UnwReadW,
|
|
||||||
UnwReadH,
|
|
||||||
UnwReadB
|
|
||||||
#ifdef UNW_DEBUG
|
|
||||||
, UnwPrintf
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* HardFaultHandler_C:
|
|
||||||
* This is called from the HardFault_HandlerAsm with a pointer the Fault stack
|
|
||||||
* as the parameter. We can then read the values from the stack and place them
|
|
||||||
* into local variables for ease of reading.
|
|
||||||
* We then read the various Fault Status and Address Registers to help decode
|
|
||||||
* cause of the fault.
|
|
||||||
* The function ends with a BKPT instruction to force control back into the debugger
|
|
||||||
*/
|
|
||||||
extern "C"
|
|
||||||
void HardFault_HandlerC(unsigned long *sp, unsigned long lr, unsigned long cause) {
|
|
||||||
|
|
||||||
static const char* causestr[] = {
|
|
||||||
"NMI","Hard","Mem","Bus","Usage","Debug","WDT","RSTC"
|
|
||||||
};
|
|
||||||
|
|
||||||
UnwindFrame btf;
|
|
||||||
|
|
||||||
// Dump report to the Programming port (interrupts are DISABLED)
|
|
||||||
TXBegin();
|
|
||||||
TX("\n\n## Software Fault detected ##\n");
|
|
||||||
TX("Cause: "); TX(causestr[cause]); TX('\n');
|
|
||||||
|
|
||||||
TX("R0 : "); TXHex(((unsigned long)sp[0])); TX('\n');
|
|
||||||
TX("R1 : "); TXHex(((unsigned long)sp[1])); TX('\n');
|
|
||||||
TX("R2 : "); TXHex(((unsigned long)sp[2])); TX('\n');
|
|
||||||
TX("R3 : "); TXHex(((unsigned long)sp[3])); TX('\n');
|
|
||||||
TX("R12 : "); TXHex(((unsigned long)sp[4])); TX('\n');
|
|
||||||
TX("LR : "); TXHex(((unsigned long)sp[5])); TX('\n');
|
|
||||||
TX("PC : "); TXHex(((unsigned long)sp[6])); TX('\n');
|
|
||||||
TX("PSR : "); TXHex(((unsigned long)sp[7])); TX('\n');
|
|
||||||
|
|
||||||
// Configurable Fault Status Register
|
|
||||||
// Consists of MMSR, BFSR and UFSR
|
|
||||||
TX("CFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED28)))); TX('\n');
|
|
||||||
|
|
||||||
// Hard Fault Status Register
|
|
||||||
TX("HFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED2C)))); TX('\n');
|
|
||||||
|
|
||||||
// Debug Fault Status Register
|
|
||||||
TX("DFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED30)))); TX('\n');
|
|
||||||
|
|
||||||
// Auxiliary Fault Status Register
|
|
||||||
TX("AFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED3C)))); TX('\n');
|
|
||||||
|
|
||||||
// Read the Fault Address Registers. These may not contain valid values.
|
|
||||||
// Check BFARVALID/MMARVALID to see if they are valid values
|
|
||||||
// MemManage Fault Address Register
|
|
||||||
TX("MMAR : "); TXHex((*((volatile unsigned long *)(0xE000ED34)))); TX('\n');
|
|
||||||
|
|
||||||
// Bus Fault Address Register
|
|
||||||
TX("BFAR : "); TXHex((*((volatile unsigned long *)(0xE000ED38)))); TX('\n');
|
|
||||||
|
|
||||||
TX("ExcLR: "); TXHex(lr); TX('\n');
|
|
||||||
TX("ExcSP: "); TXHex((unsigned long)sp); TX('\n');
|
|
||||||
|
|
||||||
btf.sp = ((unsigned long)sp) + 8*4; // The original stack pointer
|
|
||||||
btf.fp = btf.sp;
|
|
||||||
btf.lr = ((unsigned long)sp[5]);
|
|
||||||
btf.pc = ((unsigned long)sp[6]) | 1; // Force Thumb, as CORTEX only support it
|
|
||||||
|
|
||||||
// Perform a backtrace
|
|
||||||
TX("\nBacktrace:\n\n");
|
|
||||||
int ctr = 0;
|
|
||||||
UnwindStart(&btf, &UnwCallbacks, &ctr);
|
|
||||||
|
|
||||||
// Disable all NVIC interrupts
|
|
||||||
NVIC->ICER[0] = 0xFFFFFFFF;
|
|
||||||
NVIC->ICER[1] = 0xFFFFFFFF;
|
|
||||||
|
|
||||||
// Relocate VTOR table to default position
|
|
||||||
SCB->VTOR = 0;
|
|
||||||
|
|
||||||
// Disable USB
|
|
||||||
otg_disable();
|
|
||||||
|
|
||||||
// Restart watchdog
|
|
||||||
WDT_Restart(WDT);
|
|
||||||
|
|
||||||
// Reset controller
|
|
||||||
NVIC_SystemReset();
|
|
||||||
for (;;) WDT_Restart(WDT);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void NMI_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#0")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void HardFault_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#1")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void MemManage_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#2")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void BusFault_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#3")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void UsageFault_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#4")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void DebugMon_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#5")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This is NOT an exception, it is an interrupt handler - Nevertheless, the framing is the same */
|
|
||||||
__attribute__((naked)) void WDT_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#6")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void RSTC_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#7")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // ARDUINO_ARCH_SAM
|
|
||||||
@@ -19,9 +19,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Description: HAL for Arduino Due and compatible (SAM3X8E)
|
* HAL for Arduino Due and compatible (SAM3X8E)
|
||||||
*
|
|
||||||
* For ARDUINO_ARCH_SAM
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_SAM
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
@@ -42,6 +40,8 @@ uint16_t HAL_adc_result;
|
|||||||
// Public functions
|
// Public functions
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
|
TERN_(POSTMORTEM_DEBUGGING, extern void install_min_serial());
|
||||||
|
|
||||||
// HAL initialization task
|
// HAL initialization task
|
||||||
void HAL_init() {
|
void HAL_init() {
|
||||||
// Initialize the USB stack
|
// Initialize the USB stack
|
||||||
@@ -49,6 +49,7 @@ void HAL_init() {
|
|||||||
OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up
|
OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up
|
||||||
#endif
|
#endif
|
||||||
usb_task_init();
|
usb_task_init();
|
||||||
|
TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); // Install the min serial handler
|
||||||
}
|
}
|
||||||
|
|
||||||
// HAL idle task
|
// HAL idle task
|
||||||
@@ -76,6 +77,8 @@ uint8_t HAL_get_reset_source() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HAL_reboot() { rstc_start_software_reset(RSTC); }
|
||||||
|
|
||||||
void _delay_ms(const int delay_ms) {
|
void _delay_ms(const int delay_ms) {
|
||||||
// Todo: port for Due?
|
// Todo: port for Due?
|
||||||
delay(delay_ms);
|
delay(delay_ms);
|
||||||
@@ -104,4 +107,18 @@ uint16_t HAL_adc_get_result() {
|
|||||||
return HAL_adc_result;
|
return HAL_adc_result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Forward the default serial ports
|
||||||
|
#if USING_HW_SERIAL0
|
||||||
|
DefaultSerial1 MSerial0(false, Serial);
|
||||||
|
#endif
|
||||||
|
#if USING_HW_SERIAL1
|
||||||
|
DefaultSerial2 MSerial1(false, Serial1);
|
||||||
|
#endif
|
||||||
|
#if USING_HW_SERIAL2
|
||||||
|
DefaultSerial3 MSerial2(false, Serial2);
|
||||||
|
#endif
|
||||||
|
#if USING_HW_SERIAL3
|
||||||
|
DefaultSerial4 MSerial3(false, Serial3);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // ARDUINO_ARCH_SAM
|
#endif // ARDUINO_ARCH_SAM
|
||||||
|
|||||||
+58
-60
@@ -22,9 +22,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Description: HAL for Arduino Due and compatible (SAM3X8E)
|
* HAL for Arduino Due and compatible (SAM3X8E)
|
||||||
*
|
|
||||||
* For ARDUINO_ARCH_SAM
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define CPU_32_BIT
|
#define CPU_32_BIT
|
||||||
@@ -38,59 +36,61 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
// Define MYSERIAL0/1 before MarlinSerial includes!
|
#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 _MSERIAL(X) MSerial##X
|
||||||
|
#define MSERIAL(X) _MSERIAL(X)
|
||||||
|
|
||||||
#if SERIAL_PORT == -1 || ENABLED(EMERGENCY_PARSER)
|
#if SERIAL_PORT == -1 || ENABLED(EMERGENCY_PARSER)
|
||||||
#define MYSERIAL0 customizedSerial1
|
#define MYSERIAL1 customizedSerial1
|
||||||
#elif SERIAL_PORT == 0
|
#elif WITHIN(SERIAL_PORT, 0, 3)
|
||||||
#define MYSERIAL0 Serial
|
#define MYSERIAL1 MSERIAL(SERIAL_PORT)
|
||||||
#elif SERIAL_PORT == 1
|
|
||||||
#define MYSERIAL0 Serial1
|
|
||||||
#elif SERIAL_PORT == 2
|
|
||||||
#define MYSERIAL0 Serial2
|
|
||||||
#elif SERIAL_PORT == 3
|
|
||||||
#define MYSERIAL0 Serial3
|
|
||||||
#else
|
#else
|
||||||
#error "The required SERIAL_PORT must be from -1 to 3. Please update your configuration."
|
#error "The required SERIAL_PORT must be from 0 to 3, or -1 for USB Serial."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef SERIAL_PORT_2
|
#ifdef SERIAL_PORT_2
|
||||||
#if SERIAL_PORT_2 == SERIAL_PORT
|
#if SERIAL_PORT_2 == -1 || ENABLED(EMERGENCY_PARSER)
|
||||||
#error "SERIAL_PORT_2 must be different from SERIAL_PORT. Please update your configuration."
|
#define MYSERIAL2 customizedSerial2
|
||||||
#elif SERIAL_PORT_2 == -1 || ENABLED(EMERGENCY_PARSER)
|
#elif WITHIN(SERIAL_PORT_2, 0, 3)
|
||||||
#define MYSERIAL1 customizedSerial2
|
#define MYSERIAL2 MSERIAL(SERIAL_PORT_2)
|
||||||
#elif SERIAL_PORT_2 == 0
|
|
||||||
#define MYSERIAL1 Serial
|
|
||||||
#elif SERIAL_PORT_2 == 1
|
|
||||||
#define MYSERIAL1 Serial1
|
|
||||||
#elif SERIAL_PORT_2 == 2
|
|
||||||
#define MYSERIAL1 Serial2
|
|
||||||
#elif SERIAL_PORT_2 == 3
|
|
||||||
#define MYSERIAL1 Serial3
|
|
||||||
#else
|
#else
|
||||||
#error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration."
|
#error "SERIAL_PORT_2 must be from 0 to 3, or -1 for USB Serial."
|
||||||
#endif
|
#endif
|
||||||
#define NUM_SERIAL 2
|
|
||||||
#else
|
|
||||||
#define NUM_SERIAL 1
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DGUS_SERIAL_PORT
|
#ifdef SERIAL_PORT_3
|
||||||
#if DGUS_SERIAL_PORT == SERIAL_PORT
|
#if SERIAL_PORT_3 == -1 || ENABLED(EMERGENCY_PARSER)
|
||||||
#error "DGUS_SERIAL_PORT must be different from SERIAL_PORT. Please update your configuration."
|
#define MYSERIAL3 customizedSerial3
|
||||||
#elif defined(SERIAL_PORT_2) && DGUS_SERIAL_PORT == SERIAL_PORT_2
|
#elif WITHIN(SERIAL_PORT_3, 0, 3)
|
||||||
#error "DGUS_SERIAL_PORT must be different than SERIAL_PORT_2. Please update your configuration."
|
#define MYSERIAL3 MSERIAL(SERIAL_PORT_3)
|
||||||
#elif DGUS_SERIAL_PORT == -1
|
|
||||||
#define DGUS_SERIAL internalDgusSerial
|
|
||||||
#elif DGUS_SERIAL_PORT == 0
|
|
||||||
#define DGUS_SERIAL Serial
|
|
||||||
#elif DGUS_SERIAL_PORT == 1
|
|
||||||
#define DGUS_SERIAL Serial1
|
|
||||||
#elif DGUS_SERIAL_PORT == 2
|
|
||||||
#define DGUS_SERIAL Serial2
|
|
||||||
#elif DGUS_SERIAL_PORT == 3
|
|
||||||
#define DGUS_SERIAL Serial3
|
|
||||||
#else
|
#else
|
||||||
#error "DGUS_SERIAL_PORT must be from -1 to 3. Please update your configuration."
|
#error "SERIAL_PORT_3 must be from 0 to 3, or -1 for USB Serial."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MMU2_SERIAL_PORT
|
||||||
|
#if WITHIN(MMU2_SERIAL_PORT, 0, 3)
|
||||||
|
#define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT)
|
||||||
|
#else
|
||||||
|
#error "MMU2_SERIAL_PORT must be from 0 to 3."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef LCD_SERIAL_PORT
|
||||||
|
#if WITHIN(LCD_SERIAL_PORT, 0, 3)
|
||||||
|
#define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT)
|
||||||
|
#else
|
||||||
|
#error "LCD_SERIAL_PORT must be from 0 to 3."
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -100,16 +100,6 @@
|
|||||||
// On AVR this is in math.h?
|
// On AVR this is in math.h?
|
||||||
#define square(x) ((x)*(x))
|
#define square(x) ((x)*(x))
|
||||||
|
|
||||||
#ifndef strncpy_P
|
|
||||||
#define strncpy_P(dest, src, num) strncpy((dest), (src), (num))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Fix bug in pgm_read_ptr
|
|
||||||
#undef pgm_read_ptr
|
|
||||||
#define pgm_read_ptr(addr) (*((void**)(addr)))
|
|
||||||
#undef pgm_read_word
|
|
||||||
#define pgm_read_word(addr) (*((uint16_t*)(addr)))
|
|
||||||
|
|
||||||
typedef int8_t pin_t;
|
typedef int8_t pin_t;
|
||||||
|
|
||||||
#define SHARED_SERVOS HAS_SERVOS
|
#define SHARED_SERVOS HAS_SERVOS
|
||||||
@@ -130,13 +120,15 @@ void sei(); // Enable interrupts
|
|||||||
void HAL_clear_reset_source(); // clear reset reason
|
void HAL_clear_reset_source(); // clear reset reason
|
||||||
uint8_t HAL_get_reset_source(); // get reset reason
|
uint8_t HAL_get_reset_source(); // get reset reason
|
||||||
|
|
||||||
|
void HAL_reboot();
|
||||||
|
|
||||||
//
|
//
|
||||||
// ADC
|
// ADC
|
||||||
//
|
//
|
||||||
extern uint16_t HAL_adc_result; // result of last ADC conversion
|
extern uint16_t HAL_adc_result; // result of last ADC conversion
|
||||||
|
|
||||||
#ifndef analogInputToDigitalPin
|
#ifndef analogInputToDigitalPin
|
||||||
#define analogInputToDigitalPin(p) ((p < 12u) ? (p) + 54u : -1)
|
#define analogInputToDigitalPin(p) ((p < 12U) ? (p) + 54U : -1)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define HAL_ANALOG_SELECT(ch)
|
#define HAL_ANALOG_SELECT(ch)
|
||||||
@@ -176,10 +168,16 @@ void HAL_init();
|
|||||||
//
|
//
|
||||||
void _delay_ms(const int delay);
|
void _delay_ms(const int delay);
|
||||||
|
|
||||||
#pragma GCC diagnostic push
|
#if GCC_VERSION <= 50000
|
||||||
#pragma GCC diagnostic ignored "-Wunused-function"
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wunused-function"
|
||||||
|
#endif
|
||||||
|
|
||||||
int freeMemory();
|
int freeMemory();
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
|
#if GCC_VERSION <= 50000
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|||||||
@@ -0,0 +1,91 @@
|
|||||||
|
/**
|
||||||
|
* Marlin 3D Printer Firmware
|
||||||
|
* Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
|
|
||||||
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
|
#if ENABLED(POSTMORTEM_DEBUGGING)
|
||||||
|
|
||||||
|
#include "../shared/HAL_MinSerial.h"
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
static void TXBegin() {
|
||||||
|
// Disable UART interrupt in NVIC
|
||||||
|
NVIC_DisableIRQ( UART_IRQn );
|
||||||
|
|
||||||
|
// We NEED memory barriers to ensure Interrupts are actually disabled!
|
||||||
|
// ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the )
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
|
||||||
|
// Disable clock
|
||||||
|
pmc_disable_periph_clk( ID_UART );
|
||||||
|
|
||||||
|
// Configure PMC
|
||||||
|
pmc_enable_periph_clk( ID_UART );
|
||||||
|
|
||||||
|
// Disable PDC channel
|
||||||
|
UART->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS;
|
||||||
|
|
||||||
|
// Reset and disable receiver and transmitter
|
||||||
|
UART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS;
|
||||||
|
|
||||||
|
// Configure mode: 8bit, No parity, 1 bit stop
|
||||||
|
UART->UART_MR = UART_MR_CHMODE_NORMAL | US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_NO;
|
||||||
|
|
||||||
|
// Configure baudrate (asynchronous, no oversampling) to BAUDRATE bauds
|
||||||
|
UART->UART_BRGR = (SystemCoreClock / (BAUDRATE << 4));
|
||||||
|
|
||||||
|
// Enable receiver and transmitter
|
||||||
|
UART->UART_CR = UART_CR_RXEN | UART_CR_TXEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
// A SW memory barrier, to ensure GCC does not overoptimize loops
|
||||||
|
#define sw_barrier() __asm__ volatile("": : :"memory");
|
||||||
|
static void TX(char c) {
|
||||||
|
while (!(UART->UART_SR & UART_SR_TXRDY)) { WDT_Restart(WDT); sw_barrier(); };
|
||||||
|
UART->UART_THR = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
void install_min_serial() {
|
||||||
|
HAL_min_serial_init = &TXBegin;
|
||||||
|
HAL_min_serial_out = &TX;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if DISABLED(DYNAMIC_VECTORTABLE)
|
||||||
|
extern "C" {
|
||||||
|
__attribute__((naked)) void JumpHandler_ASM() {
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"b CommonHandler_ASM\n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
void __attribute__((naked, alias("JumpHandler_ASM"))) HardFault_Handler();
|
||||||
|
void __attribute__((naked, alias("JumpHandler_ASM"))) BusFault_Handler();
|
||||||
|
void __attribute__((naked, alias("JumpHandler_ASM"))) UsageFault_Handler();
|
||||||
|
void __attribute__((naked, alias("JumpHandler_ASM"))) MemManage_Handler();
|
||||||
|
void __attribute__((naked, alias("JumpHandler_ASM"))) NMI_Handler();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // POSTMORTEM_DEBUGGING
|
||||||
|
#endif // ARDUINO_ARCH_SAM
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Description: HAL for Arduino Due and compatible (SAM3X8E)
|
* HAL for Arduino Due and compatible (SAM3X8E)
|
||||||
*
|
*
|
||||||
* For ARDUINO_ARCH_SAM
|
* For ARDUINO_ARCH_SAM
|
||||||
*/
|
*/
|
||||||
@@ -56,8 +56,8 @@
|
|||||||
#pragma GCC optimize (3)
|
#pragma GCC optimize (3)
|
||||||
|
|
||||||
typedef uint8_t (*pfnSpiTransfer)(uint8_t b);
|
typedef uint8_t (*pfnSpiTransfer)(uint8_t b);
|
||||||
typedef void (*pfnSpiRxBlock)(uint8_t* buf, uint32_t nbyte);
|
typedef void (*pfnSpiRxBlock)(uint8_t *buf, uint32_t nbyte);
|
||||||
typedef void (*pfnSpiTxBlock)(const uint8_t* buf, uint32_t nbyte);
|
typedef void (*pfnSpiTxBlock)(const uint8_t *buf, uint32_t nbyte);
|
||||||
|
|
||||||
/* ---------------- Macros to be able to access definitions from asm */
|
/* ---------------- Macros to be able to access definitions from asm */
|
||||||
#define _PORT(IO) DIO ## IO ## _WPORT
|
#define _PORT(IO) DIO ## IO ## _WPORT
|
||||||
@@ -69,10 +69,10 @@
|
|||||||
|
|
||||||
// run at ~8 .. ~10Mhz - Tx version (Rx data discarded)
|
// run at ~8 .. ~10Mhz - Tx version (Rx data discarded)
|
||||||
static uint8_t spiTransferTx0(uint8_t bout) { // using Mode 0
|
static uint8_t spiTransferTx0(uint8_t bout) { // using Mode 0
|
||||||
uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(MOSI_PIN)) + 0x30; /* SODR of port */
|
uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(SD_MOSI_PIN)) + 0x30; /* SODR of port */
|
||||||
uint32_t MOSI_MASK = PIN_MASK(MOSI_PIN);
|
uint32_t MOSI_MASK = PIN_MASK(SD_MOSI_PIN);
|
||||||
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */
|
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
|
||||||
uint32_t SCK_MASK = PIN_MASK(SCK_PIN);
|
uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
|
||||||
uint32_t idx = 0;
|
uint32_t idx = 0;
|
||||||
|
|
||||||
/* Negate bout, as the assembler requires a negated value */
|
/* Negate bout, as the assembler requires a negated value */
|
||||||
@@ -154,9 +154,9 @@
|
|||||||
static uint8_t spiTransferRx0(uint8_t) { // using Mode 0
|
static uint8_t spiTransferRx0(uint8_t) { // using Mode 0
|
||||||
uint32_t bin = 0;
|
uint32_t bin = 0;
|
||||||
uint32_t work = 0;
|
uint32_t work = 0;
|
||||||
uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(MISO_PIN))+0x3C, PIN_SHIFT(MISO_PIN)); /* PDSR of port in bitband area */
|
uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(SD_MISO_PIN))+0x3C, PIN_SHIFT(SD_MISO_PIN)); /* PDSR of port in bitband area */
|
||||||
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */
|
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
|
||||||
uint32_t SCK_MASK = PIN_MASK(SCK_PIN);
|
uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
|
||||||
|
|
||||||
/* The software SPI routine */
|
/* The software SPI routine */
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
@@ -225,36 +225,36 @@
|
|||||||
static uint8_t spiTransfer1(uint8_t b) { // using Mode 0
|
static uint8_t spiTransfer1(uint8_t b) { // using Mode 0
|
||||||
int bits = 8;
|
int bits = 8;
|
||||||
do {
|
do {
|
||||||
WRITE(MOSI_PIN, b & 0x80);
|
WRITE(SD_MOSI_PIN, b & 0x80);
|
||||||
b <<= 1; // little setup time
|
b <<= 1; // little setup time
|
||||||
|
|
||||||
WRITE(SCK_PIN, HIGH);
|
WRITE(SD_SCK_PIN, HIGH);
|
||||||
DELAY_NS(125); // 10 cycles @ 84mhz
|
DELAY_NS(125); // 10 cycles @ 84mhz
|
||||||
|
|
||||||
b |= (READ(MISO_PIN) != 0);
|
b |= (READ(SD_MISO_PIN) != 0);
|
||||||
|
|
||||||
WRITE(SCK_PIN, LOW);
|
WRITE(SD_SCK_PIN, LOW);
|
||||||
DELAY_NS(125); // 10 cycles @ 84mhz
|
DELAY_NS(125); // 10 cycles @ 84mhz
|
||||||
} while (--bits);
|
} while (--bits);
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
// all the others
|
// all the others
|
||||||
static uint32_t spiDelayCyclesX4 = (F_CPU) / 1000000; // 4µs => 125khz
|
static uint32_t spiDelayCyclesX4 = 4 * (F_CPU) / 1000000; // 4µs => 125khz
|
||||||
|
|
||||||
static uint8_t spiTransferX(uint8_t b) { // using Mode 0
|
static uint8_t spiTransferX(uint8_t b) { // using Mode 0
|
||||||
int bits = 8;
|
int bits = 8;
|
||||||
do {
|
do {
|
||||||
WRITE(MOSI_PIN, b & 0x80);
|
WRITE(SD_MOSI_PIN, b & 0x80);
|
||||||
b <<= 1; // little setup time
|
b <<= 1; // little setup time
|
||||||
|
|
||||||
WRITE(SCK_PIN, HIGH);
|
WRITE(SD_SCK_PIN, HIGH);
|
||||||
__delay_4cycles(spiDelayCyclesX4);
|
DELAY_CYCLES(spiDelayCyclesX4);
|
||||||
|
|
||||||
b |= (READ(MISO_PIN) != 0);
|
b |= (READ(SD_MISO_PIN) != 0);
|
||||||
|
|
||||||
WRITE(SCK_PIN, LOW);
|
WRITE(SD_SCK_PIN, LOW);
|
||||||
__delay_4cycles(spiDelayCyclesX4);
|
DELAY_CYCLES(spiDelayCyclesX4);
|
||||||
} while (--bits);
|
} while (--bits);
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
@@ -270,11 +270,11 @@
|
|||||||
static pfnSpiTransfer spiTransferTx = (pfnSpiTransfer)spiTransferX;
|
static pfnSpiTransfer spiTransferTx = (pfnSpiTransfer)spiTransferX;
|
||||||
|
|
||||||
// Block transfers run at ~8 .. ~10Mhz - Tx version (Rx data discarded)
|
// Block transfers run at ~8 .. ~10Mhz - Tx version (Rx data discarded)
|
||||||
static void spiTxBlock0(const uint8_t* ptr, uint32_t todo) {
|
static void spiTxBlock0(const uint8_t *ptr, uint32_t todo) {
|
||||||
uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(MOSI_PIN)) + 0x30; /* SODR of port */
|
uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(SD_MOSI_PIN)) + 0x30; /* SODR of port */
|
||||||
uint32_t MOSI_MASK = PIN_MASK(MOSI_PIN);
|
uint32_t MOSI_MASK = PIN_MASK(SD_MOSI_PIN);
|
||||||
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */
|
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
|
||||||
uint32_t SCK_MASK = PIN_MASK(SCK_PIN);
|
uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
|
||||||
uint32_t work = 0;
|
uint32_t work = 0;
|
||||||
uint32_t txval = 0;
|
uint32_t txval = 0;
|
||||||
|
|
||||||
@@ -349,12 +349,12 @@
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void spiRxBlock0(uint8_t* ptr, uint32_t todo) {
|
static void spiRxBlock0(uint8_t *ptr, uint32_t todo) {
|
||||||
uint32_t bin = 0;
|
uint32_t bin = 0;
|
||||||
uint32_t work = 0;
|
uint32_t work = 0;
|
||||||
uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(MISO_PIN))+0x3C, PIN_SHIFT(MISO_PIN)); /* PDSR of port in bitband area */
|
uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(SD_MISO_PIN))+0x3C, PIN_SHIFT(SD_MISO_PIN)); /* PDSR of port in bitband area */
|
||||||
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */
|
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
|
||||||
uint32_t SCK_MASK = PIN_MASK(SCK_PIN);
|
uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
|
||||||
|
|
||||||
/* The software SPI routine */
|
/* The software SPI routine */
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
@@ -425,13 +425,13 @@
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void spiTxBlockX(const uint8_t* buf, uint32_t todo) {
|
static void spiTxBlockX(const uint8_t *buf, uint32_t todo) {
|
||||||
do {
|
do {
|
||||||
(void)spiTransferTx(*buf++);
|
(void)spiTransferTx(*buf++);
|
||||||
} while (--todo);
|
} while (--todo);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void spiRxBlockX(uint8_t* buf, uint32_t todo) {
|
static void spiRxBlockX(uint8_t *buf, uint32_t todo) {
|
||||||
do {
|
do {
|
||||||
*buf++ = spiTransferRx(0xFF);
|
*buf++ = spiTransferRx(0xFF);
|
||||||
} while (--todo);
|
} while (--todo);
|
||||||
@@ -442,31 +442,31 @@
|
|||||||
static pfnSpiRxBlock spiRxBlock = (pfnSpiRxBlock)spiRxBlockX;
|
static pfnSpiRxBlock spiRxBlock = (pfnSpiRxBlock)spiRxBlockX;
|
||||||
|
|
||||||
#if MB(ALLIGATOR)
|
#if MB(ALLIGATOR)
|
||||||
#define _SS_WRITE(S) WRITE(SS_PIN, S)
|
#define _SS_WRITE(S) WRITE(SD_SS_PIN, S)
|
||||||
#else
|
#else
|
||||||
#define _SS_WRITE(S) NOOP
|
#define _SS_WRITE(S) NOOP
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void spiBegin() {
|
void spiBegin() {
|
||||||
SET_OUTPUT(SS_PIN);
|
SET_OUTPUT(SD_SS_PIN);
|
||||||
_SS_WRITE(HIGH);
|
_SS_WRITE(HIGH);
|
||||||
SET_OUTPUT(SCK_PIN);
|
SET_OUTPUT(SD_SCK_PIN);
|
||||||
SET_INPUT(MISO_PIN);
|
SET_INPUT(SD_MISO_PIN);
|
||||||
SET_OUTPUT(MOSI_PIN);
|
SET_OUTPUT(SD_MOSI_PIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t spiRec() {
|
uint8_t spiRec() {
|
||||||
_SS_WRITE(LOW);
|
_SS_WRITE(LOW);
|
||||||
WRITE(MOSI_PIN, HIGH); // Output 1s 1
|
WRITE(SD_MOSI_PIN, HIGH); // Output 1s 1
|
||||||
uint8_t b = spiTransferRx(0xFF);
|
uint8_t b = spiTransferRx(0xFF);
|
||||||
_SS_WRITE(HIGH);
|
_SS_WRITE(HIGH);
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiRead(uint8_t* buf, uint16_t nbyte) {
|
void spiRead(uint8_t *buf, uint16_t nbyte) {
|
||||||
if (nbyte) {
|
if (nbyte) {
|
||||||
_SS_WRITE(LOW);
|
_SS_WRITE(LOW);
|
||||||
WRITE(MOSI_PIN, HIGH); // Output 1s 1
|
WRITE(SD_MOSI_PIN, HIGH); // Output 1s 1
|
||||||
spiRxBlock(buf, nbyte);
|
spiRxBlock(buf, nbyte);
|
||||||
_SS_WRITE(HIGH);
|
_SS_WRITE(HIGH);
|
||||||
}
|
}
|
||||||
@@ -478,7 +478,7 @@
|
|||||||
_SS_WRITE(HIGH);
|
_SS_WRITE(HIGH);
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiSendBlock(uint8_t token, const uint8_t* buf) {
|
void spiSendBlock(uint8_t token, const uint8_t *buf) {
|
||||||
_SS_WRITE(LOW);
|
_SS_WRITE(LOW);
|
||||||
(void)spiTransferTx(token);
|
(void)spiTransferTx(token);
|
||||||
spiTxBlock(buf, 512);
|
spiTxBlock(buf, 512);
|
||||||
@@ -510,7 +510,7 @@
|
|||||||
spiRxBlock = (pfnSpiRxBlock)spiRxBlockX;
|
spiRxBlock = (pfnSpiRxBlock)spiRxBlockX;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
spiDelayCyclesX4 = ((F_CPU) / 1000000) >> (6 - spiRate);
|
spiDelayCyclesX4 = ((F_CPU) / 1000000) >> (6 - spiRate) << 2; // spiRate of 2 gives the maximum error with current CPU
|
||||||
spiTransferTx = (pfnSpiTransfer)spiTransferX;
|
spiTransferTx = (pfnSpiTransfer)spiTransferX;
|
||||||
spiTransferRx = (pfnSpiTransfer)spiTransferX;
|
spiTransferRx = (pfnSpiTransfer)spiTransferX;
|
||||||
spiTxBlock = (pfnSpiTxBlock)spiTxBlockX;
|
spiTxBlock = (pfnSpiTxBlock)spiTxBlockX;
|
||||||
@@ -519,8 +519,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
_SS_WRITE(HIGH);
|
_SS_WRITE(HIGH);
|
||||||
WRITE(MOSI_PIN, HIGH);
|
WRITE(SD_MOSI_PIN, HIGH);
|
||||||
WRITE(SCK_PIN, LOW);
|
WRITE(SD_SCK_PIN, LOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Begin SPI transaction, set clock, bit order, data mode */
|
/** Begin SPI transaction, set clock, bit order, data mode */
|
||||||
@@ -575,27 +575,27 @@
|
|||||||
|
|
||||||
// Configure SPI pins
|
// Configure SPI pins
|
||||||
PIO_Configure(
|
PIO_Configure(
|
||||||
g_APinDescription[SCK_PIN].pPort,
|
g_APinDescription[SD_SCK_PIN].pPort,
|
||||||
g_APinDescription[SCK_PIN].ulPinType,
|
g_APinDescription[SD_SCK_PIN].ulPinType,
|
||||||
g_APinDescription[SCK_PIN].ulPin,
|
g_APinDescription[SD_SCK_PIN].ulPin,
|
||||||
g_APinDescription[SCK_PIN].ulPinConfiguration);
|
g_APinDescription[SD_SCK_PIN].ulPinConfiguration);
|
||||||
PIO_Configure(
|
PIO_Configure(
|
||||||
g_APinDescription[MOSI_PIN].pPort,
|
g_APinDescription[SD_MOSI_PIN].pPort,
|
||||||
g_APinDescription[MOSI_PIN].ulPinType,
|
g_APinDescription[SD_MOSI_PIN].ulPinType,
|
||||||
g_APinDescription[MOSI_PIN].ulPin,
|
g_APinDescription[SD_MOSI_PIN].ulPin,
|
||||||
g_APinDescription[MOSI_PIN].ulPinConfiguration);
|
g_APinDescription[SD_MOSI_PIN].ulPinConfiguration);
|
||||||
PIO_Configure(
|
PIO_Configure(
|
||||||
g_APinDescription[MISO_PIN].pPort,
|
g_APinDescription[SD_MISO_PIN].pPort,
|
||||||
g_APinDescription[MISO_PIN].ulPinType,
|
g_APinDescription[SD_MISO_PIN].ulPinType,
|
||||||
g_APinDescription[MISO_PIN].ulPin,
|
g_APinDescription[SD_MISO_PIN].ulPin,
|
||||||
g_APinDescription[MISO_PIN].ulPinConfiguration);
|
g_APinDescription[SD_MISO_PIN].ulPinConfiguration);
|
||||||
|
|
||||||
// set master mode, peripheral select, fault detection
|
// set master mode, peripheral select, fault detection
|
||||||
SPI_Configure(SPI0, ID_SPI0, SPI_MR_MSTR | SPI_MR_MODFDIS | SPI_MR_PS);
|
SPI_Configure(SPI0, ID_SPI0, SPI_MR_MSTR | SPI_MR_MODFDIS | SPI_MR_PS);
|
||||||
SPI_Enable(SPI0);
|
SPI_Enable(SPI0);
|
||||||
|
|
||||||
SET_OUTPUT(DAC0_SYNC);
|
SET_OUTPUT(DAC0_SYNC);
|
||||||
#if EXTRUDERS > 1
|
#if HAS_MULTI_EXTRUDER
|
||||||
SET_OUTPUT(DAC1_SYNC);
|
SET_OUTPUT(DAC1_SYNC);
|
||||||
WRITE(DAC1_SYNC, HIGH);
|
WRITE(DAC1_SYNC, HIGH);
|
||||||
#endif
|
#endif
|
||||||
@@ -606,7 +606,7 @@
|
|||||||
WRITE(SPI_EEPROM1_CS, HIGH);
|
WRITE(SPI_EEPROM1_CS, HIGH);
|
||||||
WRITE(SPI_EEPROM2_CS, HIGH);
|
WRITE(SPI_EEPROM2_CS, HIGH);
|
||||||
WRITE(SPI_FLASH_CS, HIGH);
|
WRITE(SPI_FLASH_CS, HIGH);
|
||||||
WRITE(SS_PIN, HIGH);
|
WRITE(SD_SS_PIN, HIGH);
|
||||||
|
|
||||||
OUT_WRITE(SDSS, LOW);
|
OUT_WRITE(SDSS, LOW);
|
||||||
|
|
||||||
@@ -645,7 +645,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Read from SPI into buffer
|
// Read from SPI into buffer
|
||||||
void spiRead(uint8_t* buf, uint16_t nbyte) {
|
void spiRead(uint8_t *buf, uint16_t nbyte) {
|
||||||
if (!nbyte) return;
|
if (!nbyte) return;
|
||||||
--nbyte;
|
--nbyte;
|
||||||
for (int i = 0; i < nbyte; i++) {
|
for (int i = 0; i < nbyte; i++) {
|
||||||
@@ -668,7 +668,7 @@
|
|||||||
//DELAY_US(1U);
|
//DELAY_US(1U);
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiSend(const uint8_t* buf, size_t nbyte) {
|
void spiSend(const uint8_t *buf, size_t nbyte) {
|
||||||
if (!nbyte) return;
|
if (!nbyte) return;
|
||||||
--nbyte;
|
--nbyte;
|
||||||
for (size_t i = 0; i < nbyte; i++) {
|
for (size_t i = 0; i < nbyte; i++) {
|
||||||
@@ -689,7 +689,7 @@
|
|||||||
FLUSH_RX();
|
FLUSH_RX();
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiSend(uint32_t chan, const uint8_t* buf, size_t nbyte) {
|
void spiSend(uint32_t chan, const uint8_t *buf, size_t nbyte) {
|
||||||
if (!nbyte) return;
|
if (!nbyte) return;
|
||||||
--nbyte;
|
--nbyte;
|
||||||
for (size_t i = 0; i < nbyte; i++) {
|
for (size_t i = 0; i < nbyte; i++) {
|
||||||
@@ -702,7 +702,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Write from buffer to SPI
|
// Write from buffer to SPI
|
||||||
void spiSendBlock(uint8_t token, const uint8_t* buf) {
|
void spiSendBlock(uint8_t token, const uint8_t *buf) {
|
||||||
SPI0->SPI_TDR = (uint32_t)token | SPI_PCS(SPI_CHAN);
|
SPI0->SPI_TDR = (uint32_t)token | SPI_PCS(SPI_CHAN);
|
||||||
WHILE_TX(0);
|
WHILE_TX(0);
|
||||||
//WHILE_RX(0);
|
//WHILE_RX(0);
|
||||||
@@ -759,7 +759,6 @@
|
|||||||
*
|
*
|
||||||
* All of the above can be avoided by defining FORCE_SOFT_SPI to force the
|
* All of the above can be avoided by defining FORCE_SOFT_SPI to force the
|
||||||
* display to use software SPI.
|
* display to use software SPI.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void spiInit(uint8_t spiRate=6) { // Default to slowest rate if not specified)
|
void spiInit(uint8_t spiRate=6) { // Default to slowest rate if not specified)
|
||||||
@@ -802,19 +801,19 @@
|
|||||||
|
|
||||||
uint8_t spiRec() { return (uint8_t)spiTransfer(0xFF); }
|
uint8_t spiRec() { return (uint8_t)spiTransfer(0xFF); }
|
||||||
|
|
||||||
void spiRead(uint8_t* buf, uint16_t nbyte) {
|
void spiRead(uint8_t *buf, uint16_t nbyte) {
|
||||||
for (int i = 0; i < nbyte; i++)
|
for (int i = 0; i < nbyte; i++)
|
||||||
buf[i] = spiTransfer(0xFF);
|
buf[i] = spiTransfer(0xFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiSend(uint8_t data) { spiTransfer(data); }
|
void spiSend(uint8_t data) { spiTransfer(data); }
|
||||||
|
|
||||||
void spiSend(const uint8_t* buf, size_t nbyte) {
|
void spiSend(const uint8_t *buf, size_t nbyte) {
|
||||||
for (uint16_t i = 0; i < nbyte; i++)
|
for (uint16_t i = 0; i < nbyte; i++)
|
||||||
spiTransfer(buf[i]);
|
spiTransfer(buf[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiSendBlock(uint8_t token, const uint8_t* buf) {
|
void spiSendBlock(uint8_t token, const uint8_t *buf) {
|
||||||
spiTransfer(token);
|
spiTransfer(token);
|
||||||
for (uint16_t i = 0; i < 512; i++)
|
for (uint16_t i = 0; i < 512; i++)
|
||||||
spiTransfer(buf[i]);
|
spiTransfer(buf[i]);
|
||||||
|
|||||||
@@ -382,7 +382,7 @@ void MarlinSerial<Cfg>::flush() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename Cfg>
|
template<typename Cfg>
|
||||||
void MarlinSerial<Cfg>::write(const uint8_t c) {
|
size_t MarlinSerial<Cfg>::write(const uint8_t c) {
|
||||||
_written = true;
|
_written = true;
|
||||||
|
|
||||||
if (Cfg::TX_SIZE == 0) {
|
if (Cfg::TX_SIZE == 0) {
|
||||||
@@ -400,7 +400,7 @@ void MarlinSerial<Cfg>::write(const uint8_t c) {
|
|||||||
// XOFF char at the RX isr, but it is properly handled there
|
// XOFF char at the RX isr, but it is properly handled there
|
||||||
if (!(HWUART->UART_IMR & UART_IMR_TXRDY) && (HWUART->UART_SR & UART_SR_TXRDY)) {
|
if (!(HWUART->UART_IMR & UART_IMR_TXRDY) && (HWUART->UART_SR & UART_SR_TXRDY)) {
|
||||||
HWUART->UART_THR = c;
|
HWUART->UART_THR = c;
|
||||||
return;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint8_t i = (tx_buffer.head + 1) & (Cfg::TX_SIZE - 1);
|
const uint8_t i = (tx_buffer.head + 1) & (Cfg::TX_SIZE - 1);
|
||||||
@@ -428,6 +428,7 @@ void MarlinSerial<Cfg>::write(const uint8_t c) {
|
|||||||
// Enable TX isr - Non atomic, but it will eventually enable TX isr
|
// Enable TX isr - Non atomic, but it will eventually enable TX isr
|
||||||
HWUART->UART_IER = UART_IER_TXRDY;
|
HWUART->UART_IER = UART_IER_TXRDY;
|
||||||
}
|
}
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Cfg>
|
template<typename Cfg>
|
||||||
@@ -473,169 +474,21 @@ void MarlinSerial<Cfg>::flushTX() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Imports from print.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(char c, int base) {
|
|
||||||
print((long)c, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(unsigned char b, int base) {
|
|
||||||
print((unsigned long)b, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(int n, int base) {
|
|
||||||
print((long)n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(unsigned int n, int base) {
|
|
||||||
print((unsigned long)n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(long n, int base) {
|
|
||||||
if (base == 0) write(n);
|
|
||||||
else if (base == 10) {
|
|
||||||
if (n < 0) { print('-'); n = -n; }
|
|
||||||
printNumber(n, 10);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
printNumber(n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(unsigned long n, int base) {
|
|
||||||
if (base == 0) write(n);
|
|
||||||
else printNumber(n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(double n, int digits) {
|
|
||||||
printFloat(n, digits);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println() {
|
|
||||||
print('\r');
|
|
||||||
print('\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(const String& s) {
|
|
||||||
print(s);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(const char c[]) {
|
|
||||||
print(c);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(char c, int base) {
|
|
||||||
print(c, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(unsigned char b, int base) {
|
|
||||||
print(b, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(int n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(unsigned int n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(long n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(unsigned long n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(double n, int digits) {
|
|
||||||
print(n, digits);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Private Methods
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::printNumber(unsigned long n, uint8_t base) {
|
|
||||||
if (n) {
|
|
||||||
unsigned char buf[8 * sizeof(long)]; // Enough space for base 2
|
|
||||||
int8_t i = 0;
|
|
||||||
while (n) {
|
|
||||||
buf[i++] = n % base;
|
|
||||||
n /= base;
|
|
||||||
}
|
|
||||||
while (i--)
|
|
||||||
print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10)));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
print('0');
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::printFloat(double number, uint8_t digits) {
|
|
||||||
// Handle negative numbers
|
|
||||||
if (number < 0.0) {
|
|
||||||
print('-');
|
|
||||||
number = -number;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Round correctly so that print(1.999, 2) prints as "2.00"
|
|
||||||
double rounding = 0.5;
|
|
||||||
LOOP_L_N(i, digits) rounding *= 0.1;
|
|
||||||
number += rounding;
|
|
||||||
|
|
||||||
// Extract the integer part of the number and print it
|
|
||||||
unsigned long int_part = (unsigned long)number;
|
|
||||||
double remainder = number - (double)int_part;
|
|
||||||
print(int_part);
|
|
||||||
|
|
||||||
// Print the decimal point, but only if there are digits beyond
|
|
||||||
if (digits) {
|
|
||||||
print('.');
|
|
||||||
// Extract digits from the remainder one at a time
|
|
||||||
while (digits--) {
|
|
||||||
remainder *= 10.0;
|
|
||||||
int toPrint = int(remainder);
|
|
||||||
print(toPrint);
|
|
||||||
remainder -= toPrint;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If not using the USB port as serial port
|
// If not using the USB port as serial port
|
||||||
#if SERIAL_PORT >= 0
|
#if defined(SERIAL_PORT) && SERIAL_PORT >= 0
|
||||||
template class MarlinSerial<MarlinSerialCfg<SERIAL_PORT>>; // Define
|
template class MarlinSerial< MarlinSerialCfg<SERIAL_PORT> >;
|
||||||
MarlinSerial<MarlinSerialCfg<SERIAL_PORT>> customizedSerial1; // Instantiate
|
MSerialT1 customizedSerial1(MarlinSerialCfg<SERIAL_PORT>::EMERGENCYPARSER);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0
|
#if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0
|
||||||
template class MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>>; // Define
|
template class MarlinSerial< MarlinSerialCfg<SERIAL_PORT_2> >;
|
||||||
MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>> customizedSerial2; // Instantiate
|
MSerialT2 customizedSerial2(MarlinSerialCfg<SERIAL_PORT_2>::EMERGENCYPARSER);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(SERIAL_PORT_3) && SERIAL_PORT_3 >= 0
|
||||||
|
template class MarlinSerial< MarlinSerialCfg<SERIAL_PORT_3> >;
|
||||||
|
MSerialT3 customizedSerial3(MarlinSerialCfg<SERIAL_PORT_3>::EMERGENCYPARSER);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // ARDUINO_ARCH_SAM
|
#endif // ARDUINO_ARCH_SAM
|
||||||
|
|||||||
@@ -30,11 +30,7 @@
|
|||||||
#include <WString.h>
|
#include <WString.h>
|
||||||
|
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
|
#include "../../core/serial_hook.h"
|
||||||
#define DEC 10
|
|
||||||
#define HEX 16
|
|
||||||
#define OCT 8
|
|
||||||
#define BIN 2
|
|
||||||
|
|
||||||
// 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
|
||||||
@@ -119,42 +115,15 @@ public:
|
|||||||
static int read();
|
static int read();
|
||||||
static void flush();
|
static void flush();
|
||||||
static ring_buffer_pos_t available();
|
static ring_buffer_pos_t available();
|
||||||
static void write(const uint8_t c);
|
static size_t write(const uint8_t c);
|
||||||
static void flushTX();
|
static void flushTX();
|
||||||
|
|
||||||
|
static inline bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; }
|
||||||
|
|
||||||
FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; }
|
FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; }
|
||||||
FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; }
|
FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; }
|
||||||
FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; }
|
FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; }
|
||||||
FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return Cfg::MAX_RX_QUEUED ? rx_max_enqueued : 0; }
|
FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return Cfg::MAX_RX_QUEUED ? rx_max_enqueued : 0; }
|
||||||
|
|
||||||
FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); }
|
|
||||||
FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); }
|
|
||||||
FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); }
|
|
||||||
FORCE_INLINE static void print(const char* str) { write(str); }
|
|
||||||
|
|
||||||
static void print(char, int = 0);
|
|
||||||
static void print(unsigned char, int = 0);
|
|
||||||
static void print(int, int = DEC);
|
|
||||||
static void print(unsigned int, int = DEC);
|
|
||||||
static void print(long, int = DEC);
|
|
||||||
static void print(unsigned long, int = DEC);
|
|
||||||
static void print(double, int = 2);
|
|
||||||
|
|
||||||
static void println(const String& s);
|
|
||||||
static void println(const char[]);
|
|
||||||
static void println(char, int = 0);
|
|
||||||
static void println(unsigned char, int = 0);
|
|
||||||
static void println(int, int = DEC);
|
|
||||||
static void println(unsigned int, int = DEC);
|
|
||||||
static void println(long, int = DEC);
|
|
||||||
static void println(unsigned long, int = DEC);
|
|
||||||
static void println(double, int = 2);
|
|
||||||
static void println();
|
|
||||||
operator bool() { return true; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
static void printNumber(unsigned long, const uint8_t);
|
|
||||||
static void printFloat(double, uint8_t);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Serial port configuration
|
// Serial port configuration
|
||||||
@@ -171,10 +140,17 @@ struct MarlinSerialCfg {
|
|||||||
static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED);
|
static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED);
|
||||||
};
|
};
|
||||||
|
|
||||||
#if SERIAL_PORT >= 0
|
#if defined(SERIAL_PORT) && SERIAL_PORT >= 0
|
||||||
extern MarlinSerial<MarlinSerialCfg<SERIAL_PORT>> customizedSerial1;
|
typedef Serial1Class< MarlinSerial< MarlinSerialCfg<SERIAL_PORT> > > MSerialT1;
|
||||||
|
extern MSerialT1 customizedSerial1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0
|
#if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0
|
||||||
extern MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>> customizedSerial2;
|
typedef Serial1Class< MarlinSerial< MarlinSerialCfg<SERIAL_PORT_2> > > MSerialT2;
|
||||||
|
extern MSerialT2 customizedSerial2;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(SERIAL_PORT_3) && SERIAL_PORT_3 >= 0
|
||||||
|
typedef Serial1Class< MarlinSerial< MarlinSerialCfg<SERIAL_PORT_3> > > MSerialT3;
|
||||||
|
extern MSerialT3 customizedSerial3;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -19,13 +19,13 @@
|
|||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MarlinSerial_Due.cpp - Hardware serial library for Arduino DUE
|
* MarlinSerial_Due.cpp - Hardware serial library for Arduino DUE
|
||||||
* Copyright (c) 2017 Eduardo José Tagle. All right reserved
|
* Copyright (c) 2017 Eduardo José Tagle. All right reserved
|
||||||
* Based on MarlinSerial for AVR, copyright (c) 2006 Nicholas Zambetti. All right reserved.
|
* Based on MarlinSerial for AVR, copyright (c) 2006 Nicholas Zambetti. All right reserved.
|
||||||
*/
|
*/
|
||||||
#ifdef ARDUINO_ARCH_SAM
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
|
||||||
@@ -33,10 +33,6 @@
|
|||||||
|
|
||||||
#include "MarlinSerialUSB.h"
|
#include "MarlinSerialUSB.h"
|
||||||
|
|
||||||
#if ENABLED(EMERGENCY_PARSER)
|
|
||||||
#include "../../feature/e_parser.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Imports from Atmel USB Stack/CDC implementation
|
// Imports from Atmel USB Stack/CDC implementation
|
||||||
extern "C" {
|
extern "C" {
|
||||||
bool usb_task_cdc_isenabled();
|
bool usb_task_cdc_isenabled();
|
||||||
@@ -50,10 +46,6 @@ extern "C" {
|
|||||||
// Pending character
|
// Pending character
|
||||||
static int pending_char = -1;
|
static int pending_char = -1;
|
||||||
|
|
||||||
#if ENABLED(EMERGENCY_PARSER)
|
|
||||||
static EmergencyParser::State emergency_state; // = EP_RESET
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Public Methods
|
// Public Methods
|
||||||
void MarlinSerialUSB::begin(const long) {}
|
void MarlinSerialUSB::begin(const long) {}
|
||||||
|
|
||||||
@@ -73,7 +65,7 @@ int MarlinSerialUSB::peek() {
|
|||||||
|
|
||||||
pending_char = udi_cdc_getc();
|
pending_char = udi_cdc_getc();
|
||||||
|
|
||||||
TERN_(EMERGENCY_PARSER, emergency_parser.update(emergency_state, (char)pending_char));
|
TERN_(EMERGENCY_PARSER, emergency_parser.update(static_cast<MSerialT1*>(this)->emergency_state, (char)pending_char));
|
||||||
|
|
||||||
return pending_char;
|
return pending_char;
|
||||||
}
|
}
|
||||||
@@ -95,29 +87,27 @@ int MarlinSerialUSB::read() {
|
|||||||
|
|
||||||
int c = udi_cdc_getc();
|
int c = udi_cdc_getc();
|
||||||
|
|
||||||
TERN_(EMERGENCY_PARSER, emergency_parser.update(emergency_state, (char)c));
|
TERN_(EMERGENCY_PARSER, emergency_parser.update(static_cast<MSerialT1*>(this)->emergency_state, (char)c));
|
||||||
|
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MarlinSerialUSB::available() {
|
int MarlinSerialUSB::available() {
|
||||||
/* If Pending chars */
|
if (pending_char > 0) return pending_char;
|
||||||
return pending_char >= 0 ||
|
return pending_char == 0 ||
|
||||||
/* or USB CDC enumerated and configured on the PC side and some
|
// or USB CDC enumerated and configured on the PC side and some bytes where sent to us */
|
||||||
bytes where sent to us */
|
(usb_task_cdc_isenabled() && udi_cdc_is_rx_ready());
|
||||||
(usb_task_cdc_isenabled() && udi_cdc_is_rx_ready());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MarlinSerialUSB::flush() { }
|
void MarlinSerialUSB::flush() { }
|
||||||
void MarlinSerialUSB::flushTX() { }
|
|
||||||
|
|
||||||
void MarlinSerialUSB::write(const uint8_t c) {
|
size_t MarlinSerialUSB::write(const uint8_t c) {
|
||||||
|
|
||||||
/* Do not even bother sending anything if USB CDC is not enumerated
|
/* Do not even bother sending anything if USB CDC is not enumerated
|
||||||
or not configured on the PC side or there is no program on the PC
|
or not configured on the PC side or there is no program on the PC
|
||||||
listening to our messages */
|
listening to our messages */
|
||||||
if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active())
|
if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active())
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
/* Wait until the PC has read the pending to be sent data */
|
/* Wait until the PC has read the pending to be sent data */
|
||||||
while (usb_task_cdc_isenabled() &&
|
while (usb_task_cdc_isenabled() &&
|
||||||
@@ -129,161 +119,23 @@ void MarlinSerialUSB::write(const uint8_t c) {
|
|||||||
or not configured on the PC side or there is no program on the PC
|
or not configured on the PC side or there is no program on the PC
|
||||||
listening to our messages at this point */
|
listening to our messages at this point */
|
||||||
if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active())
|
if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active())
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
// Fifo full
|
// Fifo full
|
||||||
// udi_cdc_signal_overrun();
|
// udi_cdc_signal_overrun();
|
||||||
udi_cdc_putc(c);
|
udi_cdc_putc(c);
|
||||||
}
|
return 1;
|
||||||
|
|
||||||
/**
|
|
||||||
* Imports from print.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
void MarlinSerialUSB::print(char c, int base) {
|
|
||||||
print((long)c, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::print(unsigned char b, int base) {
|
|
||||||
print((unsigned long)b, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::print(int n, int base) {
|
|
||||||
print((long)n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::print(unsigned int n, int base) {
|
|
||||||
print((unsigned long)n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::print(long n, int base) {
|
|
||||||
if (base == 0)
|
|
||||||
write(n);
|
|
||||||
else if (base == 10) {
|
|
||||||
if (n < 0) {
|
|
||||||
print('-');
|
|
||||||
n = -n;
|
|
||||||
}
|
|
||||||
printNumber(n, 10);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
printNumber(n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::print(unsigned long n, int base) {
|
|
||||||
if (base == 0) write(n);
|
|
||||||
else printNumber(n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::print(double n, int digits) {
|
|
||||||
printFloat(n, digits);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println() {
|
|
||||||
print('\r');
|
|
||||||
print('\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(const String& s) {
|
|
||||||
print(s);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(const char c[]) {
|
|
||||||
print(c);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(char c, int base) {
|
|
||||||
print(c, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(unsigned char b, int base) {
|
|
||||||
print(b, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(int n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(unsigned int n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(long n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(unsigned long n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(double n, int digits) {
|
|
||||||
print(n, digits);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Private Methods
|
|
||||||
|
|
||||||
void MarlinSerialUSB::printNumber(unsigned long n, uint8_t base) {
|
|
||||||
if (n) {
|
|
||||||
unsigned char buf[8 * sizeof(long)]; // Enough space for base 2
|
|
||||||
int8_t i = 0;
|
|
||||||
while (n) {
|
|
||||||
buf[i++] = n % base;
|
|
||||||
n /= base;
|
|
||||||
}
|
|
||||||
while (i--)
|
|
||||||
print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10)));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
print('0');
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::printFloat(double number, uint8_t digits) {
|
|
||||||
// Handle negative numbers
|
|
||||||
if (number < 0.0) {
|
|
||||||
print('-');
|
|
||||||
number = -number;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Round correctly so that print(1.999, 2) prints as "2.00"
|
|
||||||
double rounding = 0.5;
|
|
||||||
LOOP_L_N(i, digits)
|
|
||||||
rounding *= 0.1;
|
|
||||||
|
|
||||||
number += rounding;
|
|
||||||
|
|
||||||
// Extract the integer part of the number and print it
|
|
||||||
unsigned long int_part = (unsigned long)number;
|
|
||||||
double remainder = number - (double)int_part;
|
|
||||||
print(int_part);
|
|
||||||
|
|
||||||
// Print the decimal point, but only if there are digits beyond
|
|
||||||
if (digits) {
|
|
||||||
print('.');
|
|
||||||
// Extract digits from the remainder one at a time
|
|
||||||
while (digits--) {
|
|
||||||
remainder *= 10.0;
|
|
||||||
int toPrint = int(remainder);
|
|
||||||
print(toPrint);
|
|
||||||
remainder -= toPrint;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Preinstantiate
|
// Preinstantiate
|
||||||
#if SERIAL_PORT == -1
|
#if SERIAL_PORT == -1
|
||||||
MarlinSerialUSB customizedSerial1;
|
MSerialT1 customizedSerial1(TERN0(EMERGENCY_PARSER, true));
|
||||||
#endif
|
#endif
|
||||||
#if SERIAL_PORT_2 == -1
|
#if SERIAL_PORT_2 == -1
|
||||||
MarlinSerialUSB customizedSerial2;
|
MSerialT2 customizedSerial2(TERN0(EMERGENCY_PARSER, true));
|
||||||
|
#endif
|
||||||
|
#if SERIAL_PORT_3 == -1
|
||||||
|
MSerialT3 customizedSerial3(TERN0(EMERGENCY_PARSER, true));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // HAS_USB_SERIAL
|
#endif // HAS_USB_SERIAL
|
||||||
|
|||||||
@@ -27,73 +27,39 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
#include "../../core/serial_hook.h"
|
||||||
#if HAS_USB_SERIAL
|
|
||||||
|
|
||||||
#include <WString.h>
|
#include <WString.h>
|
||||||
|
|
||||||
#define DEC 10
|
struct MarlinSerialUSB {
|
||||||
#define HEX 16
|
void begin(const long);
|
||||||
#define OCT 8
|
void end();
|
||||||
#define BIN 2
|
int peek();
|
||||||
|
int read();
|
||||||
class MarlinSerialUSB {
|
void flush();
|
||||||
|
int available();
|
||||||
public:
|
size_t write(const uint8_t c);
|
||||||
MarlinSerialUSB() {};
|
|
||||||
static void begin(const long);
|
|
||||||
static void end();
|
|
||||||
static int peek();
|
|
||||||
static int read();
|
|
||||||
static void flush();
|
|
||||||
static void flushTX();
|
|
||||||
static bool available();
|
|
||||||
static void write(const uint8_t c);
|
|
||||||
|
|
||||||
#if ENABLED(SERIAL_STATS_DROPPED_RX)
|
#if ENABLED(SERIAL_STATS_DROPPED_RX)
|
||||||
FORCE_INLINE static uint32_t dropped() { return 0; }
|
FORCE_INLINE uint32_t dropped() { return 0; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENABLED(SERIAL_STATS_MAX_RX_QUEUED)
|
#if ENABLED(SERIAL_STATS_MAX_RX_QUEUED)
|
||||||
FORCE_INLINE static int rxMaxEnqueued() { return 0; }
|
FORCE_INLINE int rxMaxEnqueued() { return 0; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); }
|
|
||||||
FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); }
|
|
||||||
FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); }
|
|
||||||
FORCE_INLINE static void print(const char* str) { write(str); }
|
|
||||||
|
|
||||||
static void print(char, int = 0);
|
|
||||||
static void print(unsigned char, int = 0);
|
|
||||||
static void print(int, int = DEC);
|
|
||||||
static void print(unsigned int, int = DEC);
|
|
||||||
static void print(long, int = DEC);
|
|
||||||
static void print(unsigned long, int = DEC);
|
|
||||||
static void print(double, int = 2);
|
|
||||||
|
|
||||||
static void println(const String& s);
|
|
||||||
static void println(const char[]);
|
|
||||||
static void println(char, int = 0);
|
|
||||||
static void println(unsigned char, int = 0);
|
|
||||||
static void println(int, int = DEC);
|
|
||||||
static void println(unsigned int, int = DEC);
|
|
||||||
static void println(long, int = DEC);
|
|
||||||
static void println(unsigned long, int = DEC);
|
|
||||||
static void println(double, int = 2);
|
|
||||||
static void println();
|
|
||||||
operator bool() { return true; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
static void printNumber(unsigned long, const uint8_t);
|
|
||||||
static void printFloat(double, uint8_t);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#if SERIAL_PORT == -1
|
#if SERIAL_PORT == -1
|
||||||
extern MarlinSerialUSB customizedSerial1;
|
typedef Serial1Class<MarlinSerialUSB> MSerialT1;
|
||||||
|
extern MSerialT1 customizedSerial1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if SERIAL_PORT_2 == -1
|
#if SERIAL_PORT_2 == -1
|
||||||
extern MarlinSerialUSB customizedSerial2;
|
typedef Serial1Class<MarlinSerialUSB> MSerialT2;
|
||||||
|
extern MSerialT2 customizedSerial2;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // HAS_USB_SERIAL
|
#if SERIAL_PORT_3 == -1
|
||||||
|
typedef Serial1Class<MarlinSerialUSB> MSerialT3;
|
||||||
|
extern MSerialT3 customizedSerial3;
|
||||||
|
#endif
|
||||||
|
|||||||
@@ -52,25 +52,23 @@
|
|||||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __SAM3X8E__
|
#ifdef __SAM3X8E__
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfigPre.h"
|
#include "../../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
#if HAS_GRAPHICAL_LCD
|
#if HAS_MARLINUI_U8GLIB
|
||||||
|
|
||||||
#include <U8glib.h>
|
#include <U8glib.h>
|
||||||
|
|
||||||
#include "../../../MarlinCore.h"
|
#include "../../../MarlinCore.h"
|
||||||
|
|
||||||
void spiBegin();
|
#ifndef LCD_SPI_SPEED
|
||||||
void spiInit(uint8_t spiRate);
|
#define LCD_SPI_SPEED SPI_QUARTER_SPEED
|
||||||
void spiSend(uint8_t b);
|
#endif
|
||||||
void spiSend(const uint8_t* buf, size_t n);
|
|
||||||
|
|
||||||
#include "../../shared/Marduino.h"
|
#include "../../shared/HAL_SPI.h"
|
||||||
#include "../fastio.h"
|
#include "../fastio.h"
|
||||||
|
|
||||||
void u8g_SetPIOutput_DUE_hw_spi(u8g_t *u8g, uint8_t pin_index) {
|
void u8g_SetPIOutput_DUE_hw_spi(u8g_t *u8g, uint8_t pin_index) {
|
||||||
@@ -101,11 +99,7 @@ uint8_t u8g_com_HAL_DUE_shared_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_va
|
|||||||
|
|
||||||
spiBegin();
|
spiBegin();
|
||||||
|
|
||||||
#ifndef SPI_SPEED
|
spiInit(LCD_SPI_SPEED);
|
||||||
#define SPI_SPEED SPI_FULL_SPEED // use same SPI speed as SD card
|
|
||||||
#endif
|
|
||||||
spiInit(2);
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
||||||
@@ -145,6 +139,6 @@ uint8_t u8g_com_HAL_DUE_shared_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_va
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // HAS_GRAPHICAL_LCD
|
#endif // HAS_MARLINUI_U8GLIB
|
||||||
|
|
||||||
#endif //__SAM3X8E__
|
#endif // __SAM3X8E__
|
||||||
|
|||||||
@@ -59,6 +59,7 @@
|
|||||||
|
|
||||||
#if ENABLED(U8GLIB_ST7920)
|
#if ENABLED(U8GLIB_ST7920)
|
||||||
|
|
||||||
|
#include "../../../inc/MarlinConfig.h"
|
||||||
#include "../../shared/Delay.h"
|
#include "../../shared/Delay.h"
|
||||||
|
|
||||||
#include <U8glib.h>
|
#include <U8glib.h>
|
||||||
@@ -145,7 +146,7 @@ uint8_t u8g_com_HAL_DUE_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_va
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if ENABLED(LIGHTWEIGHT_UI)
|
#if ENABLED(LIGHTWEIGHT_UI)
|
||||||
#include "../../../lcd/ultralcd.h"
|
#include "../../../lcd/marlinui.h"
|
||||||
#include "../../shared/HAL_ST7920.h"
|
#include "../../shared/HAL_ST7920.h"
|
||||||
|
|
||||||
#define ST7920_CS_PIN LCD_PINS_RS
|
#define ST7920_CS_PIN LCD_PINS_RS
|
||||||
|
|||||||
@@ -57,10 +57,7 @@
|
|||||||
|
|
||||||
#include "../../../inc/MarlinConfigPre.h"
|
#include "../../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
#if HAS_GRAPHICAL_LCD && DISABLED(U8GLIB_ST7920)
|
#if HAS_MARLINUI_U8GLIB && DISABLED(U8GLIB_ST7920)
|
||||||
|
|
||||||
#undef SPI_SPEED
|
|
||||||
#define SPI_SPEED 2 // About 2 MHz
|
|
||||||
|
|
||||||
#include "u8g_com_HAL_DUE_sw_spi_shared.h"
|
#include "u8g_com_HAL_DUE_sw_spi_shared.h"
|
||||||
|
|
||||||
@@ -144,5 +141,5 @@ uint8_t u8g_com_HAL_DUE_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // HAS_GRAPHICAL_LCD && !U8GLIB_ST7920
|
#endif // HAS_MARLINUI_U8GLIB && !U8GLIB_ST7920
|
||||||
#endif // ARDUINO_ARCH_SAM
|
#endif // ARDUINO_ARCH_SAM
|
||||||
|
|||||||
@@ -57,8 +57,9 @@
|
|||||||
|
|
||||||
#include "../../../inc/MarlinConfigPre.h"
|
#include "../../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
#if HAS_GRAPHICAL_LCD
|
#if HAS_MARLINUI_U8GLIB
|
||||||
|
|
||||||
|
#include "../../../inc/MarlinConfig.h"
|
||||||
#include "../../shared/Delay.h"
|
#include "../../shared/Delay.h"
|
||||||
|
|
||||||
#include <U8glib.h>
|
#include <U8glib.h>
|
||||||
@@ -108,5 +109,5 @@ void u8g_spiSend_sw_DUE_mode_3(uint8_t val) { // 3.5MHz
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // HAS_GRAPHICAL_LCD
|
#endif // HAS_MARLINUI_U8GLIB
|
||||||
#endif // ARDUINO_ARCH_SAM
|
#endif // ARDUINO_ARCH_SAM
|
||||||
|
|||||||
@@ -53,7 +53,6 @@
|
|||||||
* per page. We can't emulate EE endurance with FLASH for all
|
* per page. We can't emulate EE endurance with FLASH for all
|
||||||
* bytes, but we can emulate endurance for a given percent of
|
* bytes, but we can emulate endurance for a given percent of
|
||||||
* bytes.
|
* bytes.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//#define EE_EMU_DEBUG
|
//#define EE_EMU_DEBUG
|
||||||
@@ -61,7 +60,7 @@
|
|||||||
#define EEPROMSize 4096
|
#define EEPROMSize 4096
|
||||||
#define PagesPerGroup 128
|
#define PagesPerGroup 128
|
||||||
#define GroupCount 2
|
#define GroupCount 2
|
||||||
#define PageSize 256u
|
#define PageSize 256U
|
||||||
|
|
||||||
/* Flash storage */
|
/* Flash storage */
|
||||||
typedef struct FLASH_SECTOR {
|
typedef struct FLASH_SECTOR {
|
||||||
@@ -136,11 +135,11 @@ static uint8_t buffer[256] = {0}, // The RAM buffer to accumulate writes
|
|||||||
#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) {
|
||||||
|
|
||||||
#ifdef EE_EMU_DEBUG
|
#ifdef EE_EMU_DEBUG
|
||||||
|
|
||||||
const uint8_t* c = (const uint8_t*) data;
|
const uint8_t *c = (const uint8_t*) data;
|
||||||
char buffer[80];
|
char buffer[80];
|
||||||
|
|
||||||
sprintf_P(buffer, PSTR("Page: %d (0x%04x)\n"), page, page);
|
sprintf_P(buffer, PSTR("Page: %d (0x%04x)\n"), page, page);
|
||||||
@@ -182,7 +181,7 @@ static void ee_Dump(const int page, const void* data) {
|
|||||||
* @param data (pointer to the data buffer)
|
* @param data (pointer to the data buffer)
|
||||||
*/
|
*/
|
||||||
__attribute__ ((long_call, section (".ramfunc")))
|
__attribute__ ((long_call, section (".ramfunc")))
|
||||||
static bool ee_PageWrite(uint16_t page, const void* data) {
|
static bool ee_PageWrite(uint16_t page, const void *data) {
|
||||||
|
|
||||||
uint16_t i;
|
uint16_t i;
|
||||||
uint32_t addrflash = uint32_t(getFlashStorage(page));
|
uint32_t addrflash = uint32_t(getFlashStorage(page));
|
||||||
@@ -294,8 +293,8 @@ static bool ee_PageWrite(uint16_t page, const void* data) {
|
|||||||
ee_Dump(-page, data);
|
ee_Dump(-page, data);
|
||||||
|
|
||||||
// Calculate count of changed bits
|
// Calculate count of changed bits
|
||||||
uint32_t* p1 = (uint32_t*)addrflash;
|
uint32_t *p1 = (uint32_t*)addrflash;
|
||||||
uint32_t* p2 = (uint32_t*)data;
|
uint32_t *p2 = (uint32_t*)data;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
for (i =0; i<PageSize >> 2; i++) {
|
for (i =0; i<PageSize >> 2; i++) {
|
||||||
if (p1[i] != p2[i]) {
|
if (p1[i] != p2[i]) {
|
||||||
@@ -471,7 +470,7 @@ static uint8_t ee_Read(uint32_t address, bool excludeRAMBuffer=false) {
|
|||||||
for (int page = curPage - 1; page >= 0; --page) {
|
for (int page = curPage - 1; page >= 0; --page) {
|
||||||
|
|
||||||
// Get a pointer to the flash page
|
// Get a pointer to the flash page
|
||||||
uint8_t* pflash = (uint8_t*)getFlashStorage(page + curGroup * PagesPerGroup);
|
uint8_t *pflash = (uint8_t*)getFlashStorage(page + curGroup * PagesPerGroup);
|
||||||
|
|
||||||
uint16_t i = 0;
|
uint16_t i = 0;
|
||||||
while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */
|
while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */
|
||||||
@@ -551,7 +550,7 @@ static uint32_t ee_GetAddrRange(uint32_t address, bool excludeRAMBuffer=false) {
|
|||||||
for (int page = curPage - 1; page >= 0; --page) {
|
for (int page = curPage - 1; page >= 0; --page) {
|
||||||
|
|
||||||
// Get a pointer to the flash page
|
// Get a pointer to the flash page
|
||||||
uint8_t* pflash = (uint8_t*)getFlashStorage(page + curGroup * PagesPerGroup);
|
uint8_t *pflash = (uint8_t*)getFlashStorage(page + curGroup * PagesPerGroup);
|
||||||
|
|
||||||
uint16_t i = 0;
|
uint16_t i = 0;
|
||||||
while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */
|
while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */
|
||||||
@@ -590,7 +589,7 @@ static uint32_t ee_GetAddrRange(uint32_t address, bool excludeRAMBuffer=false) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool ee_IsPageClean(int page) {
|
static bool ee_IsPageClean(int page) {
|
||||||
uint32_t* pflash = (uint32_t*) getFlashStorage(page);
|
uint32_t *pflash = (uint32_t*) getFlashStorage(page);
|
||||||
for (uint16_t i = 0; i < (PageSize >> 2); ++i)
|
for (uint16_t i = 0; i < (PageSize >> 2); ++i)
|
||||||
if (*pflash++ != 0xFFFFFFFF) return false;
|
if (*pflash++ != 0xFFFFFFFF) return false;
|
||||||
return true;
|
return true;
|
||||||
@@ -600,7 +599,7 @@ static bool ee_Flush(uint32_t overrideAddress = 0xFFFFFFFF, uint8_t overrideData
|
|||||||
|
|
||||||
// Check if RAM buffer has something to be written
|
// Check if RAM buffer has something to be written
|
||||||
bool isEmpty = true;
|
bool isEmpty = true;
|
||||||
uint32_t* p = (uint32_t*) &buffer[0];
|
uint32_t *p = (uint32_t*) &buffer[0];
|
||||||
for (uint16_t j = 0; j < (PageSize >> 2); j++) {
|
for (uint16_t j = 0; j < (PageSize >> 2); j++) {
|
||||||
if (*p++ != 0xFFFFFFFF) {
|
if (*p++ != 0xFFFFFFFF) {
|
||||||
isEmpty = false;
|
isEmpty = false;
|
||||||
@@ -977,14 +976,13 @@ bool PersistentStore::access_start() { ee_Init(); return true; }
|
|||||||
bool PersistentStore::access_finish() { ee_Flush(); return true; }
|
bool PersistentStore::access_finish() { ee_Flush(); return true; }
|
||||||
|
|
||||||
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
||||||
|
uint16_t written = 0;
|
||||||
while (size--) {
|
while (size--) {
|
||||||
uint8_t * const p = (uint8_t * const)pos;
|
uint8_t * const p = (uint8_t * const)pos;
|
||||||
uint8_t v = *value;
|
uint8_t v = *value;
|
||||||
// EEPROM has only ~100,000 write cycles,
|
if (v != ee_Read(uint32_t(p))) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed!
|
||||||
// so only write bytes that have changed!
|
|
||||||
if (v != ee_Read(uint32_t(p))) {
|
|
||||||
ee_Write(uint32_t(p), v);
|
ee_Write(uint32_t(p), v);
|
||||||
delay(2);
|
if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes
|
||||||
if (ee_Read(uint32_t(p)) != v) {
|
if (ee_Read(uint32_t(p)) != v) {
|
||||||
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
||||||
return true;
|
return true;
|
||||||
@@ -997,7 +995,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
||||||
do {
|
do {
|
||||||
uint8_t c = ee_Read(uint32_t(pos));
|
uint8_t c = ee_Read(uint32_t(pos));
|
||||||
if (writing) *value = c;
|
if (writing) *value = c;
|
||||||
|
|||||||
@@ -42,14 +42,13 @@ bool PersistentStore::access_start() { eeprom_init(); return true; }
|
|||||||
bool PersistentStore::access_finish() { return true; }
|
bool PersistentStore::access_finish() { return true; }
|
||||||
|
|
||||||
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
||||||
|
uint16_t written = 0;
|
||||||
while (size--) {
|
while (size--) {
|
||||||
uint8_t * const p = (uint8_t * const)pos;
|
uint8_t * const p = (uint8_t * const)pos;
|
||||||
uint8_t v = *value;
|
uint8_t v = *value;
|
||||||
// EEPROM has only ~100,000 write cycles,
|
if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed!
|
||||||
// so only write bytes that have changed!
|
|
||||||
if (v != eeprom_read_byte(p)) {
|
|
||||||
eeprom_write_byte(p, v);
|
eeprom_write_byte(p, v);
|
||||||
delay(2);
|
if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes
|
||||||
if (eeprom_read_byte(p) != v) {
|
if (eeprom_read_byte(p) != v) {
|
||||||
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
||||||
return true;
|
return true;
|
||||||
@@ -62,7 +61,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
||||||
do {
|
do {
|
||||||
uint8_t c = eeprom_read_byte((uint8_t*)pos);
|
uint8_t c = eeprom_read_byte((uint8_t*)pos);
|
||||||
if (writing) *value = c;
|
if (writing) *value = c;
|
||||||
|
|||||||
@@ -64,4 +64,10 @@ void setup_endstop_interrupts() {
|
|||||||
TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN));
|
TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN));
|
||||||
TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN));
|
TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN));
|
||||||
TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN));
|
TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN));
|
||||||
|
TERN_(HAS_I_MAX, _ATTACH(I_MAX_PIN));
|
||||||
|
TERN_(HAS_I_MIN, _ATTACH(I_MIN_PIN));
|
||||||
|
TERN_(HAS_J_MAX, _ATTACH(J_MAX_PIN));
|
||||||
|
TERN_(HAS_J_MIN, _ATTACH(J_MIN_PIN));
|
||||||
|
TERN_(HAS_K_MAX, _ATTACH(K_MAX_PIN));
|
||||||
|
TERN_(HAS_K_MIN, _ATTACH(K_MIN_PIN));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
* For ARDUINO_ARCH_SAM
|
* For ARDUINO_ARCH_SAM
|
||||||
* Note the code here was specifically crafted by disassembling what GCC produces
|
* Note the code here was specifically crafted by disassembling what GCC produces
|
||||||
* out of it, so GCC is able to optimize it out as much as possible to the least
|
* out of it, so GCC is able to optimize it out as much as possible to the least
|
||||||
* amount of instructions. Be very carefull if you modify them, as "clean code"
|
* amount of instructions. Be very careful if you modify them, as "clean code"
|
||||||
* leads to less efficient compiled code!!
|
* leads to less efficient compiled code!!
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -50,7 +50,7 @@
|
|||||||
#define PWM_PIN(P) WITHIN(P, 2, 13)
|
#define PWM_PIN(P) WITHIN(P, 2, 13)
|
||||||
|
|
||||||
#ifndef MASK
|
#ifndef MASK
|
||||||
#define MASK(PIN) (1 << PIN)
|
#define MASK(PIN) _BV(PIN)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -163,6 +163,9 @@
|
|||||||
#define SET_INPUT(IO) _SET_INPUT(IO)
|
#define SET_INPUT(IO) _SET_INPUT(IO)
|
||||||
// Set pin as input with pullup (wrapper)
|
// Set pin as input with pullup (wrapper)
|
||||||
#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0)
|
#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0)
|
||||||
|
// Set pin as input with pulldown (substitution)
|
||||||
|
#define SET_INPUT_PULLDOWN SET_INPUT
|
||||||
|
|
||||||
// Set pin as output (wrapper) - reads the pin and sets the output to that value
|
// Set pin as output (wrapper) - reads the pin and sets the output to that value
|
||||||
#define SET_OUTPUT(IO) _SET_OUTPUT(IO)
|
#define SET_OUTPUT(IO) _SET_OUTPUT(IO)
|
||||||
// Set pin as PWM
|
// Set pin as PWM
|
||||||
@@ -477,7 +480,7 @@
|
|||||||
#define DIO91_PIN 15
|
#define DIO91_PIN 15
|
||||||
#define DIO91_WPORT PIOB
|
#define DIO91_WPORT PIOB
|
||||||
|
|
||||||
#if ARDUINO_SAM_ARCHIM
|
#ifdef ARDUINO_SAM_ARCHIM
|
||||||
|
|
||||||
#define DIO92_PIN 11
|
#define DIO92_PIN 11
|
||||||
#define DIO92_WPORT PIOC
|
#define DIO92_WPORT PIOC
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ void Stepper::digipot_init() {
|
|||||||
NVIC_SetPriority(PWM_IRQn, NVIC_EncodePriority(0, 10, 0)); // normal priority for PWM module (can stand some jitter on the Vref signals)
|
NVIC_SetPriority(PWM_IRQn, NVIC_EncodePriority(0, 10, 0)); // normal priority for PWM module (can stand some jitter on the Vref signals)
|
||||||
}
|
}
|
||||||
|
|
||||||
void Stepper::digipot_current(const uint8_t driver, const int16_t current) {
|
void Stepper::set_digipot_current(const uint8_t driver, const int16_t current) {
|
||||||
|
|
||||||
if (!(PWM->PWM_CH_NUM[0].PWM_CPRD == PWM_PERIOD_US)) digipot_init(); // Init PWM system if needed
|
if (!(PWM->PWM_CH_NUM[0].PWM_CPRD == PWM_PERIOD_US)) digipot_init(); // Init PWM system if needed
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,7 @@
|
|||||||
* Usually the hardware SPI pins are only available to the LCD. This makes the DUE hard SPI used at the same time
|
* Usually the hardware SPI pins are only available to the LCD. This makes the DUE hard SPI used at the same time
|
||||||
* as the TMC2130 soft SPI the most common setup.
|
* as the TMC2130 soft SPI the most common setup.
|
||||||
*/
|
*/
|
||||||
#define _IS_HW_SPI(P) (defined(TMC_SW_##P) && (TMC_SW_##P == MOSI_PIN || TMC_SW_##P == MISO_PIN || TMC_SW_##P == SCK_PIN))
|
#define _IS_HW_SPI(P) (defined(TMC_SW_##P) && (TMC_SW_##P == SD_MOSI_PIN || TMC_SW_##P == SD_MISO_PIN || TMC_SW_##P == SD_SCK_PIN))
|
||||||
|
|
||||||
#if ENABLED(SDSUPPORT) && HAS_DRIVER(TMC2130)
|
#if ENABLED(SDSUPPORT) && HAS_DRIVER(TMC2130)
|
||||||
#if ENABLED(TMC_USE_SW_SPI)
|
#if ENABLED(TMC_USE_SW_SPI)
|
||||||
@@ -57,5 +57,5 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAS_TMC_SW_SERIAL
|
#if HAS_TMC_SW_SERIAL
|
||||||
#error "TMC220x Software Serial is not supported on this platform."
|
#error "TMC220x Software Serial is not supported on the DUE platform."
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -179,5 +179,4 @@ void pwm_details(int32_t pin) {
|
|||||||
* ----------------+--------
|
* ----------------+--------
|
||||||
* ID | PB11
|
* ID | PB11
|
||||||
* VBOF | PB10
|
* VBOF | PB10
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -43,22 +43,22 @@
|
|||||||
#define SPI_PIN 87
|
#define SPI_PIN 87
|
||||||
#define SPI_CHAN 1
|
#define SPI_CHAN 1
|
||||||
#endif
|
#endif
|
||||||
#define SCK_PIN 76
|
#define SD_SCK_PIN 76
|
||||||
#define MISO_PIN 74
|
#define SD_MISO_PIN 74
|
||||||
#define MOSI_PIN 75
|
#define SD_MOSI_PIN 75
|
||||||
#else
|
#else
|
||||||
// defaults
|
// defaults
|
||||||
#define DUE_SOFTWARE_SPI
|
#define DUE_SOFTWARE_SPI
|
||||||
#ifndef SCK_PIN
|
#ifndef SD_SCK_PIN
|
||||||
#define SCK_PIN 52
|
#define SD_SCK_PIN 52
|
||||||
#endif
|
#endif
|
||||||
#ifndef MISO_PIN
|
#ifndef SD_MISO_PIN
|
||||||
#define MISO_PIN 50
|
#define SD_MISO_PIN 50
|
||||||
#endif
|
#endif
|
||||||
#ifndef MOSI_PIN
|
#ifndef SD_MOSI_PIN
|
||||||
#define MOSI_PIN 51
|
#define SD_MOSI_PIN 51
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* A.28, A.29, B.21, C.26, C.29 */
|
/* A.28, A.29, B.21, C.26, C.29 */
|
||||||
#define SS_PIN SDSS
|
#define SD_SS_PIN SDSS
|
||||||
|
|||||||
@@ -21,9 +21,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Description: HAL for Arduino Due and compatible (SAM3X8E)
|
* HAL Timers for Arduino Due and compatible (SAM3X8E)
|
||||||
*
|
|
||||||
* For ARDUINO_ARCH_SAM
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_SAM
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
@@ -123,7 +121,7 @@ void HAL_timer_disable_interrupt(const uint8_t timer_num) {
|
|||||||
|
|
||||||
// missing from CMSIS: Check if interrupt is enabled or not
|
// missing from CMSIS: Check if interrupt is enabled or not
|
||||||
static bool NVIC_GetEnabledIRQ(IRQn_Type IRQn) {
|
static bool NVIC_GetEnabledIRQ(IRQn_Type IRQn) {
|
||||||
return (NVIC->ISER[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F))) != 0;
|
return TEST(NVIC->ISER[uint32_t(IRQn) >> 5], uint32_t(IRQn) & 0x1F);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HAL_timer_interrupt_enabled(const uint8_t timer_num) {
|
bool HAL_timer_interrupt_enabled(const uint8_t timer_num) {
|
||||||
|
|||||||
@@ -21,9 +21,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* HAL for Arduino Due and compatible (SAM3X8E)
|
* HAL Timers for Arduino Due and compatible (SAM3X8E)
|
||||||
*
|
|
||||||
* For ARDUINO_ARCH_SAM
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|||||||
@@ -14,5 +14,5 @@ if current_OS == 'Windows':
|
|||||||
|
|
||||||
# Use bossac.exe on Windows
|
# Use bossac.exe on Windows
|
||||||
env.Replace(
|
env.Replace(
|
||||||
UPLOADCMD="bossac --info --unlock --write --verify --reset --erase -U false --boot"
|
UPLOADCMD="bossac --info --unlock --write --verify --reset --erase -U false --boot $SOURCE"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -93,5 +93,5 @@
|
|||||||
#define USB_VBOF_GPIO (PIO_PB10_IDX)
|
#define USB_VBOF_GPIO (PIO_PB10_IDX)
|
||||||
#define USB_VBOF_FLAGS (PIO_PERIPH_A | PIO_DEFAULT)
|
#define USB_VBOF_FLAGS (PIO_PERIPH_A | PIO_DEFAULT)
|
||||||
/*! Active level of the USB_VBOF output pin. */
|
/*! Active level of the USB_VBOF output pin. */
|
||||||
#define USB_VBOF_ACTIVE_LEVEL LOW
|
#define USB_VBOF_ACTIVE_STATE LOW
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
|
|||||||
@@ -173,11 +173,11 @@
|
|||||||
# define __always_inline __forceinline
|
# define __always_inline __forceinline
|
||||||
#elif (defined __GNUC__)
|
#elif (defined __GNUC__)
|
||||||
#ifdef __always_inline
|
#ifdef __always_inline
|
||||||
# undef __always_inline
|
# undef __always_inline
|
||||||
#endif
|
#endif
|
||||||
# define __always_inline inline __attribute__((__always_inline__))
|
# define __always_inline inline __attribute__((__always_inline__))
|
||||||
#elif (defined __ICCARM__)
|
#elif (defined __ICCARM__)
|
||||||
# define __always_inline _Pragma("inline=forced")
|
# define __always_inline _Pragma("inline=forced")
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -188,11 +188,11 @@
|
|||||||
* heuristics and not inline the function.
|
* heuristics and not inline the function.
|
||||||
*/
|
*/
|
||||||
#ifdef __CC_ARM
|
#ifdef __CC_ARM
|
||||||
# define __no_inline __attribute__((noinline))
|
# define __no_inline __attribute__((noinline))
|
||||||
#elif (defined __GNUC__)
|
#elif (defined __GNUC__)
|
||||||
# define __no_inline __attribute__((__noinline__))
|
# define __no_inline __attribute__((__noinline__))
|
||||||
#elif (defined __ICCARM__)
|
#elif (defined __ICCARM__)
|
||||||
# define __no_inline _Pragma("inline=never")
|
# define __no_inline _Pragma("inline=never")
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*! \brief This macro is used to test fatal errors.
|
/*! \brief This macro is used to test fatal errors.
|
||||||
@@ -211,9 +211,9 @@
|
|||||||
# else
|
# else
|
||||||
#undef TEST_SUITE_DEFINE_ASSERT_MACRO
|
#undef TEST_SUITE_DEFINE_ASSERT_MACRO
|
||||||
# define Assert(expr) \
|
# define Assert(expr) \
|
||||||
{\
|
{\
|
||||||
if (!(expr)) while (true);\
|
if (!(expr)) while (true);\
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
#else
|
#else
|
||||||
# define Assert(expr) ((void) 0)
|
# define Assert(expr) ((void) 0)
|
||||||
@@ -609,37 +609,37 @@ typedef struct
|
|||||||
# define clz(u) ((u) ? __CLZ(u) : 32)
|
# define clz(u) ((u) ? __CLZ(u) : 32)
|
||||||
#else
|
#else
|
||||||
# define clz(u) (((u) == 0) ? 32 : \
|
# define clz(u) (((u) == 0) ? 32 : \
|
||||||
((u) & (1ul << 31)) ? 0 : \
|
((u) & (1UL << 31)) ? 0 : \
|
||||||
((u) & (1ul << 30)) ? 1 : \
|
((u) & (1UL << 30)) ? 1 : \
|
||||||
((u) & (1ul << 29)) ? 2 : \
|
((u) & (1UL << 29)) ? 2 : \
|
||||||
((u) & (1ul << 28)) ? 3 : \
|
((u) & (1UL << 28)) ? 3 : \
|
||||||
((u) & (1ul << 27)) ? 4 : \
|
((u) & (1UL << 27)) ? 4 : \
|
||||||
((u) & (1ul << 26)) ? 5 : \
|
((u) & (1UL << 26)) ? 5 : \
|
||||||
((u) & (1ul << 25)) ? 6 : \
|
((u) & (1UL << 25)) ? 6 : \
|
||||||
((u) & (1ul << 24)) ? 7 : \
|
((u) & (1UL << 24)) ? 7 : \
|
||||||
((u) & (1ul << 23)) ? 8 : \
|
((u) & (1UL << 23)) ? 8 : \
|
||||||
((u) & (1ul << 22)) ? 9 : \
|
((u) & (1UL << 22)) ? 9 : \
|
||||||
((u) & (1ul << 21)) ? 10 : \
|
((u) & (1UL << 21)) ? 10 : \
|
||||||
((u) & (1ul << 20)) ? 11 : \
|
((u) & (1UL << 20)) ? 11 : \
|
||||||
((u) & (1ul << 19)) ? 12 : \
|
((u) & (1UL << 19)) ? 12 : \
|
||||||
((u) & (1ul << 18)) ? 13 : \
|
((u) & (1UL << 18)) ? 13 : \
|
||||||
((u) & (1ul << 17)) ? 14 : \
|
((u) & (1UL << 17)) ? 14 : \
|
||||||
((u) & (1ul << 16)) ? 15 : \
|
((u) & (1UL << 16)) ? 15 : \
|
||||||
((u) & (1ul << 15)) ? 16 : \
|
((u) & (1UL << 15)) ? 16 : \
|
||||||
((u) & (1ul << 14)) ? 17 : \
|
((u) & (1UL << 14)) ? 17 : \
|
||||||
((u) & (1ul << 13)) ? 18 : \
|
((u) & (1UL << 13)) ? 18 : \
|
||||||
((u) & (1ul << 12)) ? 19 : \
|
((u) & (1UL << 12)) ? 19 : \
|
||||||
((u) & (1ul << 11)) ? 20 : \
|
((u) & (1UL << 11)) ? 20 : \
|
||||||
((u) & (1ul << 10)) ? 21 : \
|
((u) & (1UL << 10)) ? 21 : \
|
||||||
((u) & (1ul << 9)) ? 22 : \
|
((u) & (1UL << 9)) ? 22 : \
|
||||||
((u) & (1ul << 8)) ? 23 : \
|
((u) & (1UL << 8)) ? 23 : \
|
||||||
((u) & (1ul << 7)) ? 24 : \
|
((u) & (1UL << 7)) ? 24 : \
|
||||||
((u) & (1ul << 6)) ? 25 : \
|
((u) & (1UL << 6)) ? 25 : \
|
||||||
((u) & (1ul << 5)) ? 26 : \
|
((u) & (1UL << 5)) ? 26 : \
|
||||||
((u) & (1ul << 4)) ? 27 : \
|
((u) & (1UL << 4)) ? 27 : \
|
||||||
((u) & (1ul << 3)) ? 28 : \
|
((u) & (1UL << 3)) ? 28 : \
|
||||||
((u) & (1ul << 2)) ? 29 : \
|
((u) & (1UL << 2)) ? 29 : \
|
||||||
((u) & (1ul << 1)) ? 30 : \
|
((u) & (1UL << 1)) ? 30 : \
|
||||||
31)
|
31)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -654,38 +654,38 @@ typedef struct
|
|||||||
#if (defined __GNUC__) || (defined __CC_ARM)
|
#if (defined __GNUC__) || (defined __CC_ARM)
|
||||||
# define ctz(u) ((u) ? __builtin_ctz(u) : 32)
|
# define ctz(u) ((u) ? __builtin_ctz(u) : 32)
|
||||||
#else
|
#else
|
||||||
# define ctz(u) ((u) & (1ul << 0) ? 0 : \
|
# define ctz(u) ((u) & (1UL << 0) ? 0 : \
|
||||||
(u) & (1ul << 1) ? 1 : \
|
(u) & (1UL << 1) ? 1 : \
|
||||||
(u) & (1ul << 2) ? 2 : \
|
(u) & (1UL << 2) ? 2 : \
|
||||||
(u) & (1ul << 3) ? 3 : \
|
(u) & (1UL << 3) ? 3 : \
|
||||||
(u) & (1ul << 4) ? 4 : \
|
(u) & (1UL << 4) ? 4 : \
|
||||||
(u) & (1ul << 5) ? 5 : \
|
(u) & (1UL << 5) ? 5 : \
|
||||||
(u) & (1ul << 6) ? 6 : \
|
(u) & (1UL << 6) ? 6 : \
|
||||||
(u) & (1ul << 7) ? 7 : \
|
(u) & (1UL << 7) ? 7 : \
|
||||||
(u) & (1ul << 8) ? 8 : \
|
(u) & (1UL << 8) ? 8 : \
|
||||||
(u) & (1ul << 9) ? 9 : \
|
(u) & (1UL << 9) ? 9 : \
|
||||||
(u) & (1ul << 10) ? 10 : \
|
(u) & (1UL << 10) ? 10 : \
|
||||||
(u) & (1ul << 11) ? 11 : \
|
(u) & (1UL << 11) ? 11 : \
|
||||||
(u) & (1ul << 12) ? 12 : \
|
(u) & (1UL << 12) ? 12 : \
|
||||||
(u) & (1ul << 13) ? 13 : \
|
(u) & (1UL << 13) ? 13 : \
|
||||||
(u) & (1ul << 14) ? 14 : \
|
(u) & (1UL << 14) ? 14 : \
|
||||||
(u) & (1ul << 15) ? 15 : \
|
(u) & (1UL << 15) ? 15 : \
|
||||||
(u) & (1ul << 16) ? 16 : \
|
(u) & (1UL << 16) ? 16 : \
|
||||||
(u) & (1ul << 17) ? 17 : \
|
(u) & (1UL << 17) ? 17 : \
|
||||||
(u) & (1ul << 18) ? 18 : \
|
(u) & (1UL << 18) ? 18 : \
|
||||||
(u) & (1ul << 19) ? 19 : \
|
(u) & (1UL << 19) ? 19 : \
|
||||||
(u) & (1ul << 20) ? 20 : \
|
(u) & (1UL << 20) ? 20 : \
|
||||||
(u) & (1ul << 21) ? 21 : \
|
(u) & (1UL << 21) ? 21 : \
|
||||||
(u) & (1ul << 22) ? 22 : \
|
(u) & (1UL << 22) ? 22 : \
|
||||||
(u) & (1ul << 23) ? 23 : \
|
(u) & (1UL << 23) ? 23 : \
|
||||||
(u) & (1ul << 24) ? 24 : \
|
(u) & (1UL << 24) ? 24 : \
|
||||||
(u) & (1ul << 25) ? 25 : \
|
(u) & (1UL << 25) ? 25 : \
|
||||||
(u) & (1ul << 26) ? 26 : \
|
(u) & (1UL << 26) ? 26 : \
|
||||||
(u) & (1ul << 27) ? 27 : \
|
(u) & (1UL << 27) ? 27 : \
|
||||||
(u) & (1ul << 28) ? 28 : \
|
(u) & (1UL << 28) ? 28 : \
|
||||||
(u) & (1ul << 29) ? 29 : \
|
(u) & (1UL << 29) ? 29 : \
|
||||||
(u) & (1ul << 30) ? 30 : \
|
(u) & (1UL << 30) ? 30 : \
|
||||||
(u) & (1ul << 31) ? 31 : \
|
(u) & (1UL << 31) ? 31 : \
|
||||||
32)
|
32)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -1106,17 +1106,16 @@ static inline uint16_t convert_byte_array_to_16_bit(uint8_t *data)
|
|||||||
/* Converts a 8 Byte array into a 32-Bit value */
|
/* Converts a 8 Byte array into a 32-Bit value */
|
||||||
static inline uint32_t convert_byte_array_to_32_bit(uint8_t *data)
|
static inline uint32_t convert_byte_array_to_32_bit(uint8_t *data)
|
||||||
{
|
{
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
uint32_t u32;
|
uint32_t u32;
|
||||||
uint8_t u8[8];
|
uint8_t u8[8];
|
||||||
}long_addr;
|
}long_addr;
|
||||||
uint8_t index;
|
uint8_t index;
|
||||||
for (index = 0; index < 4; index++)
|
for (index = 0; index < 4; index++) {
|
||||||
{
|
long_addr.u8[index] = *data++;
|
||||||
long_addr.u8[index] = *data++;
|
}
|
||||||
}
|
return long_addr.u32;
|
||||||
return long_addr.u32;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ Ctrl_status sd_mmc_spi_test_unit_ready() {
|
|||||||
Ctrl_status sd_mmc_spi_read_capacity(uint32_t *nb_sector) {
|
Ctrl_status sd_mmc_spi_read_capacity(uint32_t *nb_sector) {
|
||||||
if (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted())
|
if (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted())
|
||||||
return CTRL_NO_PRESENT;
|
return CTRL_NO_PRESENT;
|
||||||
*nb_sector = card.getSd2Card().cardSize() - 1;
|
*nb_sector = card.diskIODriver()->cardSize() - 1;
|
||||||
return CTRL_GOOD;
|
return CTRL_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,30 +68,30 @@ Ctrl_status sd_mmc_spi_usb_read_10(uint32_t addr, uint16_t nb_sector) {
|
|||||||
{
|
{
|
||||||
char buffer[80];
|
char buffer[80];
|
||||||
sprintf_P(buffer, PSTR("SDRD: %d @ 0x%08x\n"), nb_sector, addr);
|
sprintf_P(buffer, PSTR("SDRD: %d @ 0x%08x\n"), nb_sector, addr);
|
||||||
PORT_REDIRECT(0);
|
PORT_REDIRECT(SERIAL_PORTMASK(0));
|
||||||
SERIAL_ECHO(buffer);
|
SERIAL_ECHO(buffer);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Start reading
|
// Start reading
|
||||||
if (!card.getSd2Card().readStart(addr))
|
if (!card.diskIODriver()->readStart(addr))
|
||||||
return CTRL_FAIL;
|
return CTRL_FAIL;
|
||||||
|
|
||||||
// For each specified sector
|
// For each specified sector
|
||||||
while (nb_sector--) {
|
while (nb_sector--) {
|
||||||
|
|
||||||
// Read a sector
|
// Read a sector
|
||||||
card.getSd2Card().readData(sector_buf);
|
card.diskIODriver()->readData(sector_buf);
|
||||||
|
|
||||||
// RAM -> USB
|
// RAM -> USB
|
||||||
if (!udi_msc_trans_block(true, sector_buf, SD_MMC_BLOCK_SIZE, NULL)) {
|
if (!udi_msc_trans_block(true, sector_buf, SD_MMC_BLOCK_SIZE, nullptr)) {
|
||||||
card.getSd2Card().readStop();
|
card.diskIODriver()->readStop();
|
||||||
return CTRL_FAIL;
|
return CTRL_FAIL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stop reading
|
// Stop reading
|
||||||
card.getSd2Card().readStop();
|
card.diskIODriver()->readStop();
|
||||||
|
|
||||||
// Done
|
// Done
|
||||||
return CTRL_GOOD;
|
return CTRL_GOOD;
|
||||||
@@ -108,29 +108,29 @@ Ctrl_status sd_mmc_spi_usb_write_10(uint32_t addr, uint16_t nb_sector) {
|
|||||||
{
|
{
|
||||||
char buffer[80];
|
char buffer[80];
|
||||||
sprintf_P(buffer, PSTR("SDWR: %d @ 0x%08x\n"), nb_sector, addr);
|
sprintf_P(buffer, PSTR("SDWR: %d @ 0x%08x\n"), nb_sector, addr);
|
||||||
PORT_REDIRECT(0);
|
PORT_REDIRECT(SERIAL_PORTMASK(0));
|
||||||
SERIAL_ECHO(buffer);
|
SERIAL_ECHO(buffer);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!card.getSd2Card().writeStart(addr, nb_sector))
|
if (!card.diskIODriver()->writeStart(addr, nb_sector))
|
||||||
return CTRL_FAIL;
|
return CTRL_FAIL;
|
||||||
|
|
||||||
// For each specified sector
|
// For each specified sector
|
||||||
while (nb_sector--) {
|
while (nb_sector--) {
|
||||||
|
|
||||||
// USB -> RAM
|
// USB -> RAM
|
||||||
if (!udi_msc_trans_block(false, sector_buf, SD_MMC_BLOCK_SIZE, NULL)) {
|
if (!udi_msc_trans_block(false, sector_buf, SD_MMC_BLOCK_SIZE, nullptr)) {
|
||||||
card.getSd2Card().writeStop();
|
card.diskIODriver()->writeStop();
|
||||||
return CTRL_FAIL;
|
return CTRL_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write a sector
|
// Write a sector
|
||||||
card.getSd2Card().writeData(sector_buf);
|
card.diskIODriver()->writeData(sector_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stop writing
|
// Stop writing
|
||||||
card.getSd2Card().writeStop();
|
card.diskIODriver()->writeStop();
|
||||||
|
|
||||||
// Done
|
// Done
|
||||||
return CTRL_GOOD;
|
return CTRL_GOOD;
|
||||||
|
|||||||
@@ -675,11 +675,11 @@ iram_size_t udi_cdc_multi_write_buf(uint8_t port, const void* buf, iram_size_t s
|
|||||||
* - \code // Waits and gets a value on CDC line
|
* - \code // Waits and gets a value on CDC line
|
||||||
int udi_cdc_getc(void);
|
int udi_cdc_getc(void);
|
||||||
// Reads a RAM buffer on CDC line
|
// Reads a RAM buffer on CDC line
|
||||||
iram_size_t udi_cdc_read_buf(int* buf, iram_size_t size);
|
iram_size_t udi_cdc_read_buf(int *buf, iram_size_t size);
|
||||||
// Puts a byte on CDC line
|
// Puts a byte on CDC line
|
||||||
int udi_cdc_putc(int value);
|
int udi_cdc_putc(int value);
|
||||||
// Writes a RAM buffer on CDC line
|
// Writes a RAM buffer on CDC line
|
||||||
iram_size_t udi_cdc_write_buf(const int* buf, iram_size_t size); \endcode
|
iram_size_t udi_cdc_write_buf(const int *buf, iram_size_t size); \endcode
|
||||||
*
|
*
|
||||||
* \section udi_cdc_use_cases Advanced use cases
|
* \section udi_cdc_use_cases Advanced use cases
|
||||||
* For more advanced use of the UDI CDC module, see the following use cases:
|
* For more advanced use of the UDI CDC module, see the following use cases:
|
||||||
|
|||||||
@@ -264,7 +264,7 @@ bool usb_task_extra_string(void) {
|
|||||||
** Handle device requests that the ASF stack doesn't
|
** Handle device requests that the ASF stack doesn't
|
||||||
*/
|
*/
|
||||||
bool usb_task_other_requests(void) {
|
bool usb_task_other_requests(void) {
|
||||||
uint8_t* ptr = 0;
|
uint8_t *ptr = 0;
|
||||||
uint16_t size = 0;
|
uint16_t size = 0;
|
||||||
|
|
||||||
if (Udd_setup_type() == USB_REQ_TYPE_VENDOR) {
|
if (Udd_setup_type() == USB_REQ_TYPE_VENDOR) {
|
||||||
@@ -322,7 +322,7 @@ void usb_task_init(void) {
|
|||||||
char *sptr;
|
char *sptr;
|
||||||
|
|
||||||
// Patch in the filament diameter
|
// Patch in the filament diameter
|
||||||
sprintf_P(diam, PSTR("%d"), (int)((DEFAULT_NOMINAL_FILAMENT_DIA) * 1000.0));
|
itoa((int)((DEFAULT_NOMINAL_FILAMENT_DIA) * 1000), diam, 10);
|
||||||
|
|
||||||
// And copy it to the proper place, expanding it to unicode
|
// And copy it to the proper place, expanding it to unicode
|
||||||
sptr = &diam[0];
|
sptr = &diam[0];
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ void watchdogSetup() {
|
|||||||
#if ENABLED(USE_WATCHDOG)
|
#if ENABLED(USE_WATCHDOG)
|
||||||
|
|
||||||
// 4 seconds timeout
|
// 4 seconds timeout
|
||||||
uint32_t timeout = 4000;
|
uint32_t timeout = TERN(WATCHDOG_DURATION_8S, 8000, 4000);
|
||||||
|
|
||||||
// Calculate timeout value in WDT counter ticks: This assumes
|
// Calculate timeout value in WDT counter ticks: This assumes
|
||||||
// the slow clock is running at 32.768 kHz watchdog
|
// the slow clock is running at 32.768 kHz watchdog
|
||||||
|
|||||||
@@ -20,14 +20,10 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "FlushableHardwareSerial.h"
|
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_ESP32
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
|
|
||||||
FlushableHardwareSerial::FlushableHardwareSerial(int uart_nr)
|
#include "FlushableHardwareSerial.h"
|
||||||
: HardwareSerial(uart_nr)
|
|
||||||
{}
|
|
||||||
|
|
||||||
FlushableHardwareSerial flushableSerial(0);
|
Serial1Class<FlushableHardwareSerial> flushableSerial(false, 0);
|
||||||
|
|
||||||
#endif // ARDUINO_ARCH_ESP32
|
#endif
|
||||||
|
|||||||
@@ -21,17 +21,14 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_ESP32
|
|
||||||
|
|
||||||
#include <HardwareSerial.h>
|
#include <HardwareSerial.h>
|
||||||
|
|
||||||
|
#include "../shared/Marduino.h"
|
||||||
|
#include "../../core/serial_hook.h"
|
||||||
|
|
||||||
class FlushableHardwareSerial : public HardwareSerial {
|
class FlushableHardwareSerial : public HardwareSerial {
|
||||||
public:
|
public:
|
||||||
FlushableHardwareSerial(int uart_nr);
|
FlushableHardwareSerial(int uart_nr) : HardwareSerial(uart_nr) {}
|
||||||
|
|
||||||
inline void flushTX() { /* No need to flush the hardware serial, but defined here for compatibility. */ }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern FlushableHardwareSerial flushableSerial;
|
extern Serial1Class<FlushableHardwareSerial> flushableSerial;
|
||||||
|
|
||||||
#endif // ARDUINO_ARCH_ESP32
|
|
||||||
|
|||||||
@@ -40,6 +40,10 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if ENABLED(ESP3D_WIFISUPPORT)
|
||||||
|
DefaultSerial1 MSerial0(false, Serial2Socket);
|
||||||
|
#endif
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Externs
|
// Externs
|
||||||
// ------------------------
|
// ------------------------
|
||||||
@@ -86,8 +90,6 @@ volatile int numPWMUsed = 0,
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void HAL_init() { i2s_init(); }
|
|
||||||
|
|
||||||
void HAL_init_board() {
|
void HAL_init_board() {
|
||||||
|
|
||||||
#if ENABLED(ESP3D_WIFISUPPORT)
|
#if ENABLED(ESP3D_WIFISUPPORT)
|
||||||
@@ -122,6 +124,10 @@ void HAL_init_board() {
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Initialize the i2s peripheral only if the I2S stepper stream is enabled.
|
||||||
|
// The following initialization is performed after Serial1 and Serial2 are defined as
|
||||||
|
// their native pins might conflict with the i2s stream even when they are remapped.
|
||||||
|
TERN_(I2S_STEPPER_STREAM, i2s_init());
|
||||||
}
|
}
|
||||||
|
|
||||||
void HAL_idletask() {
|
void HAL_idletask() {
|
||||||
@@ -135,6 +141,8 @@ void HAL_clear_reset_source() { }
|
|||||||
|
|
||||||
uint8_t HAL_get_reset_source() { return rtc_get_reset_reason(1); }
|
uint8_t HAL_get_reset_source() { return rtc_get_reset_reason(1); }
|
||||||
|
|
||||||
|
void HAL_reboot() { ESP.restart(); }
|
||||||
|
|
||||||
void _delay_ms(int delay_ms) { delay(delay_ms); }
|
void _delay_ms(int delay_ms) { delay(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
|
||||||
@@ -179,6 +187,7 @@ void HAL_adc_init() {
|
|||||||
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_HEATED_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_CHAMBER, adc1_set_attenuation(get_channel(TEMP_CHAMBER_PIN), ADC_ATTEN_11db));
|
||||||
|
TERN_(HAS_TEMP_COOLER, adc1_set_attenuation(get_channel(TEMP_COOLER_PIN), ADC_ATTEN_11db));
|
||||||
TERN_(FILAMENT_WIDTH_SENSOR, adc1_set_attenuation(get_channel(FILWIDTH_PIN), ADC_ATTEN_11db));
|
TERN_(FILAMENT_WIDTH_SENSOR, adc1_set_attenuation(get_channel(FILWIDTH_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.
|
||||||
|
|||||||
+28
-17
@@ -15,11 +15,12 @@
|
|||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* 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
|
#pragma once
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Description: HAL for Espressif ESP32 WiFi
|
* HAL for Espressif ESP32 WiFi
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define CPU_32_BIT
|
#define CPU_32_BIT
|
||||||
@@ -50,17 +51,16 @@
|
|||||||
|
|
||||||
extern portMUX_TYPE spinlock;
|
extern portMUX_TYPE spinlock;
|
||||||
|
|
||||||
#define MYSERIAL0 flushableSerial
|
#define MYSERIAL1 flushableSerial
|
||||||
|
|
||||||
#if EITHER(WIFISUPPORT, ESP3D_WIFISUPPORT)
|
#if EITHER(WIFISUPPORT, ESP3D_WIFISUPPORT)
|
||||||
#if ENABLED(ESP3D_WIFISUPPORT)
|
#if ENABLED(ESP3D_WIFISUPPORT)
|
||||||
#define MYSERIAL1 Serial2Socket
|
typedef ForwardSerial1Class< decltype(Serial2Socket) > DefaultSerial1;
|
||||||
|
extern DefaultSerial1 MSerial0;
|
||||||
|
#define MYSERIAL2 MSerial0
|
||||||
#else
|
#else
|
||||||
#define MYSERIAL1 webSocketSerial
|
#define MYSERIAL2 webSocketSerial
|
||||||
#endif
|
#endif
|
||||||
#define NUM_SERIAL 2
|
|
||||||
#else
|
|
||||||
#define NUM_SERIAL 1
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define CRITICAL_SECTION_START() portENTER_CRITICAL(&spinlock)
|
#define CRITICAL_SECTION_START() portENTER_CRITICAL(&spinlock)
|
||||||
@@ -69,10 +69,6 @@ extern portMUX_TYPE spinlock;
|
|||||||
#define ENABLE_ISRS() if (spinlock.owner != portMUX_FREE_VAL) portEXIT_CRITICAL(&spinlock)
|
#define ENABLE_ISRS() if (spinlock.owner != portMUX_FREE_VAL) portEXIT_CRITICAL(&spinlock)
|
||||||
#define DISABLE_ISRS() portENTER_CRITICAL(&spinlock)
|
#define DISABLE_ISRS() portENTER_CRITICAL(&spinlock)
|
||||||
|
|
||||||
// Fix bug in pgm_read_ptr
|
|
||||||
#undef pgm_read_ptr
|
|
||||||
#define pgm_read_ptr(addr) (*(addr))
|
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Types
|
// Types
|
||||||
// ------------------------
|
// ------------------------
|
||||||
@@ -92,18 +88,33 @@ extern uint16_t HAL_adc_result;
|
|||||||
// Public functions
|
// Public functions
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
|
//
|
||||||
|
// Tone
|
||||||
|
//
|
||||||
|
void toneInit();
|
||||||
|
void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration=0);
|
||||||
|
void noTone(const pin_t _pin);
|
||||||
|
|
||||||
// clear reset reason
|
// clear reset reason
|
||||||
void HAL_clear_reset_source();
|
void HAL_clear_reset_source();
|
||||||
|
|
||||||
// reset reason
|
// reset reason
|
||||||
uint8_t HAL_get_reset_source();
|
uint8_t HAL_get_reset_source();
|
||||||
|
|
||||||
|
void HAL_reboot();
|
||||||
|
|
||||||
void _delay_ms(int delay);
|
void _delay_ms(int delay);
|
||||||
|
|
||||||
#pragma GCC diagnostic push
|
#if GCC_VERSION <= 50000
|
||||||
#pragma GCC diagnostic ignored "-Wunused-function"
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wunused-function"
|
||||||
|
#endif
|
||||||
|
|
||||||
int freeMemory();
|
int freeMemory();
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
|
#if GCC_VERSION <= 50000
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
|
||||||
void analogWrite(pin_t pin, int value);
|
void analogWrite(pin_t pin, int value);
|
||||||
|
|
||||||
@@ -128,7 +139,7 @@ void HAL_adc_start_conversion(const uint8_t adc_pin);
|
|||||||
#define HAL_IDLETASK 1
|
#define HAL_IDLETASK 1
|
||||||
#define BOARD_INIT() HAL_init_board();
|
#define BOARD_INIT() HAL_init_board();
|
||||||
void HAL_idletask();
|
void HAL_idletask();
|
||||||
void HAL_init();
|
inline void HAL_init() {}
|
||||||
void HAL_init_board();
|
void HAL_init_board();
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -157,14 +168,14 @@ FORCE_INLINE static void DELAY_CYCLES(uint32_t x) {
|
|||||||
|
|
||||||
if (stop >= start) {
|
if (stop >= start) {
|
||||||
// no overflow, so only loop while in between start and stop:
|
// no overflow, so only loop while in between start and stop:
|
||||||
// 0x00000000 -----------------start****stop-- 0xffffffff
|
// 0x00000000 -----------------start****stop-- 0xFFFFFFFF
|
||||||
while (ccount >= start && ccount < stop) {
|
while (ccount >= start && ccount < stop) {
|
||||||
__asm__ __volatile__ ( "rsr %0, ccount" : "=a" (ccount) );
|
__asm__ __volatile__ ( "rsr %0, ccount" : "=a" (ccount) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// stop did overflow, so only loop while outside of stop and start:
|
// stop did overflow, so only loop while outside of stop and start:
|
||||||
// 0x00000000 **stop-------------------start** 0xffffffff
|
// 0x00000000 **stop-------------------start** 0xFFFFFFFF
|
||||||
while (ccount >= start || ccount < stop) {
|
while (ccount >= start || ccount < stop) {
|
||||||
__asm__ __volatile__ ( "rsr %0, ccount" : "=a" (ccount) );
|
__asm__ __volatile__ ( "rsr %0, ccount" : "=a" (ccount) );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,11 +53,11 @@ static SPISettings spiConfig;
|
|||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
void spiBegin() {
|
void spiBegin() {
|
||||||
#if !PIN_EXISTS(SS)
|
#if !PIN_EXISTS(SD_SS)
|
||||||
#error "SS_PIN not defined!"
|
#error "SD_SS_PIN not defined!"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
OUT_WRITE(SS_PIN, HIGH);
|
OUT_WRITE(SD_SS_PIN, HIGH);
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiInit(uint8_t spiRate) {
|
void spiInit(uint8_t spiRate) {
|
||||||
@@ -85,7 +85,7 @@ uint8_t spiRec() {
|
|||||||
return returnByte;
|
return returnByte;
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiRead(uint8_t* buf, uint16_t nbyte) {
|
void spiRead(uint8_t *buf, uint16_t nbyte) {
|
||||||
SPI.beginTransaction(spiConfig);
|
SPI.beginTransaction(spiConfig);
|
||||||
SPI.transferBytes(0, buf, nbyte);
|
SPI.transferBytes(0, buf, nbyte);
|
||||||
SPI.endTransaction();
|
SPI.endTransaction();
|
||||||
@@ -97,7 +97,7 @@ void spiSend(uint8_t b) {
|
|||||||
SPI.endTransaction();
|
SPI.endTransaction();
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiSendBlock(uint8_t token, const uint8_t* buf) {
|
void spiSendBlock(uint8_t token, const uint8_t *buf) {
|
||||||
SPI.beginTransaction(spiConfig);
|
SPI.beginTransaction(spiConfig);
|
||||||
SPI.transfer(token);
|
SPI.transfer(token);
|
||||||
SPI.writeBytes(const_cast<uint8_t*>(buf), 512);
|
SPI.writeBytes(const_cast<uint8_t*>(buf), 512);
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ class Servo {
|
|||||||
MAX_PULSE_WIDTH = 2400, // Longest pulse sent to a servo
|
MAX_PULSE_WIDTH = 2400, // Longest pulse sent to a servo
|
||||||
TAU_MSEC = 20,
|
TAU_MSEC = 20,
|
||||||
TAU_USEC = (TAU_MSEC * 1000),
|
TAU_USEC = (TAU_MSEC * 1000),
|
||||||
MAX_COMPARE = ((1 << 16) - 1), // 65535
|
MAX_COMPARE = _BV(16) - 1, // 65535
|
||||||
CHANNEL_MAX_NUM = 16;
|
CHANNEL_MAX_NUM = 16;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -0,0 +1,59 @@
|
|||||||
|
/**
|
||||||
|
* Marlin 3D Printer Firmware
|
||||||
|
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
|
* Copypaste of SAMD51 HAL developed by Giuliano Zaro (AKA GMagician)
|
||||||
|
*
|
||||||
|
* 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/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Description: Tone function for ESP32
|
||||||
|
* Derived from https://forum.arduino.cc/index.php?topic=136500.msg2903012#msg2903012
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
|
|
||||||
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
#include "HAL.h"
|
||||||
|
|
||||||
|
static pin_t tone_pin;
|
||||||
|
volatile static int32_t toggles;
|
||||||
|
|
||||||
|
void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration) {
|
||||||
|
tone_pin = _pin;
|
||||||
|
toggles = 2 * frequency * duration / 1000;
|
||||||
|
HAL_timer_start(TONE_TIMER_NUM, 2 * frequency);
|
||||||
|
}
|
||||||
|
|
||||||
|
void noTone(const pin_t _pin) {
|
||||||
|
HAL_timer_disable_interrupt(TONE_TIMER_NUM);
|
||||||
|
WRITE(_pin, LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
HAL_TONE_TIMER_ISR() {
|
||||||
|
HAL_timer_isr_prologue(TONE_TIMER_NUM);
|
||||||
|
|
||||||
|
if (toggles) {
|
||||||
|
toggles--;
|
||||||
|
TOGGLE(tone_pin);
|
||||||
|
}
|
||||||
|
else noTone(tone_pin); // turn off interrupt
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // ARDUINO_ARCH_ESP32
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
#include "wifi.h"
|
#include "wifi.h"
|
||||||
#include <ESPAsyncWebServer.h>
|
#include <ESPAsyncWebServer.h>
|
||||||
|
|
||||||
WebSocketSerial webSocketSerial;
|
MSerialWebSocketT webSocketSerial(false);
|
||||||
AsyncWebSocket ws("/ws"); // TODO Move inside the class.
|
AsyncWebSocket ws("/ws"); // TODO Move inside the class.
|
||||||
|
|
||||||
// RingBuffer impl
|
// RingBuffer impl
|
||||||
@@ -86,7 +86,7 @@ int RingBuffer::read() {
|
|||||||
ring_buffer_pos_t RingBuffer::read(uint8_t *buffer) {
|
ring_buffer_pos_t RingBuffer::read(uint8_t *buffer) {
|
||||||
ring_buffer_pos_t len = available();
|
ring_buffer_pos_t len = available();
|
||||||
|
|
||||||
for(ring_buffer_pos_t i = 0; read_index != write_index; i++) {
|
for (ring_buffer_pos_t i = 0; read_index != write_index; i++) {
|
||||||
buffer[i] = data[read_index];
|
buffer[i] = data[read_index];
|
||||||
read_index = NEXT_INDEX(read_index, size);
|
read_index = NEXT_INDEX(read_index, size);
|
||||||
}
|
}
|
||||||
@@ -137,17 +137,12 @@ size_t WebSocketSerial::write(const uint8_t c) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t WebSocketSerial::write(const uint8_t* buffer, size_t size) {
|
size_t WebSocketSerial::write(const uint8_t *buffer, size_t size) {
|
||||||
size_t written = 0;
|
size_t written = 0;
|
||||||
for(size_t i = 0; i < size; i++) {
|
for (size_t i = 0; i < size; i++)
|
||||||
written += write(buffer[i]);
|
written += write(buffer[i]);
|
||||||
}
|
|
||||||
return written;
|
return written;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebSocketSerial::flushTX() {
|
|
||||||
// No need to do anything as there's no benefit to sending partial lines over the websocket connection.
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // WIFISUPPORT
|
#endif // WIFISUPPORT
|
||||||
#endif // ARDUINO_ARCH_ESP32
|
#endif // ARDUINO_ARCH_ESP32
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
#include "../../core/serial_hook.h"
|
||||||
|
|
||||||
#include <Stream.h>
|
#include <Stream.h>
|
||||||
|
|
||||||
@@ -53,7 +54,7 @@ public:
|
|||||||
ring_buffer_pos_t read(uint8_t *buffer);
|
ring_buffer_pos_t read(uint8_t *buffer);
|
||||||
void flush();
|
void flush();
|
||||||
ring_buffer_pos_t write(const uint8_t c);
|
ring_buffer_pos_t write(const uint8_t c);
|
||||||
ring_buffer_pos_t write(const uint8_t* buffer, ring_buffer_pos_t size);
|
ring_buffer_pos_t write(const uint8_t *buffer, ring_buffer_pos_t size);
|
||||||
};
|
};
|
||||||
|
|
||||||
class WebSocketSerial: public Stream {
|
class WebSocketSerial: public Stream {
|
||||||
@@ -68,11 +69,8 @@ public:
|
|||||||
int peek();
|
int peek();
|
||||||
int read();
|
int read();
|
||||||
void flush();
|
void flush();
|
||||||
void flushTX();
|
|
||||||
size_t write(const uint8_t c);
|
size_t write(const uint8_t c);
|
||||||
size_t write(const uint8_t* buffer, size_t size);
|
size_t write(const uint8_t *buffer, size_t size);
|
||||||
|
|
||||||
operator bool() { return true; }
|
|
||||||
|
|
||||||
#if ENABLED(SERIAL_STATS_DROPPED_RX)
|
#if ENABLED(SERIAL_STATS_DROPPED_RX)
|
||||||
FORCE_INLINE uint32_t dropped() { return 0; }
|
FORCE_INLINE uint32_t dropped() { return 0; }
|
||||||
@@ -83,4 +81,5 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
extern WebSocketSerial webSocketSerial;
|
typedef Serial1Class<WebSocketSerial> MSerialWebSocketT;
|
||||||
|
extern MSerialWebSocketT webSocketSerial;
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
||||||
for (size_t i = 0; i < size; i++) {
|
for (size_t i = 0; i < size; i++) {
|
||||||
uint8_t c = EEPROM.read(pos++);
|
uint8_t c = EEPROM.read(pos++);
|
||||||
if (writing) value[i] = c;
|
if (writing) value[i] = c;
|
||||||
|
|||||||
@@ -59,4 +59,10 @@ void setup_endstop_interrupts() {
|
|||||||
TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN));
|
TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN));
|
||||||
TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN));
|
TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN));
|
||||||
TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN));
|
TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN));
|
||||||
|
TERN_(HAS_I_MAX, _ATTACH(I_MAX_PIN));
|
||||||
|
TERN_(HAS_I_MIN, _ATTACH(I_MIN_PIN));
|
||||||
|
TERN_(HAS_J_MAX, _ATTACH(J_MAX_PIN));
|
||||||
|
TERN_(HAS_J_MIN, _ATTACH(J_MIN_PIN));
|
||||||
|
TERN_(HAS_K_MAX, _ATTACH(K_MAX_PIN));
|
||||||
|
TERN_(HAS_K_MIN, _ATTACH(K_MIN_PIN));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,6 +52,9 @@
|
|||||||
// Set pin as input with pullup wrapper
|
// Set pin as input with pullup wrapper
|
||||||
#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0)
|
#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0)
|
||||||
|
|
||||||
|
// Set pin as input with pulldown (substitution)
|
||||||
|
#define SET_INPUT_PULLDOWN SET_INPUT
|
||||||
|
|
||||||
// Set pin as output wrapper
|
// Set pin as output wrapper
|
||||||
#define SET_OUTPUT(IO) do{ _SET_OUTPUT(IO); }while(0)
|
#define SET_OUTPUT(IO) do{ _SET_OUTPUT(IO); }while(0)
|
||||||
|
|
||||||
|
|||||||
@@ -139,7 +139,7 @@ static void IRAM_ATTR i2s_intr_handler_default(void *arg) {
|
|||||||
I2S0.int_clr.val = I2S0.int_st.val; //clear pending interrupt
|
I2S0.int_clr.val = I2S0.int_st.val; //clear pending interrupt
|
||||||
}
|
}
|
||||||
|
|
||||||
void stepperTask(void* parameter) {
|
void stepperTask(void *parameter) {
|
||||||
uint32_t remaining = 0;
|
uint32_t remaining = 0;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
@@ -184,7 +184,7 @@ int i2s_init() {
|
|||||||
|
|
||||||
// Allocate the array of pointers to the buffers
|
// Allocate the array of pointers to the buffers
|
||||||
dma.buffers = (uint32_t **)malloc(sizeof(uint32_t*) * DMA_BUF_COUNT);
|
dma.buffers = (uint32_t **)malloc(sizeof(uint32_t*) * DMA_BUF_COUNT);
|
||||||
if (dma.buffers == nullptr) return -1;
|
if (!dma.buffers) return -1;
|
||||||
|
|
||||||
// Allocate each buffer that can be used by the DMA controller
|
// Allocate each buffer that can be used by the DMA controller
|
||||||
for (int buf_idx = 0; buf_idx < DMA_BUF_COUNT; buf_idx++) {
|
for (int buf_idx = 0; buf_idx < DMA_BUF_COUNT; buf_idx++) {
|
||||||
@@ -194,7 +194,7 @@ int i2s_init() {
|
|||||||
|
|
||||||
// Allocate the array of DMA descriptors
|
// Allocate the array of DMA descriptors
|
||||||
dma.desc = (lldesc_t**) malloc(sizeof(lldesc_t*) * DMA_BUF_COUNT);
|
dma.desc = (lldesc_t**) malloc(sizeof(lldesc_t*) * DMA_BUF_COUNT);
|
||||||
if (dma.desc == nullptr) return -1;
|
if (!dma.desc) return -1;
|
||||||
|
|
||||||
// Allocate each DMA descriptor that will be used by the DMA controller
|
// Allocate each DMA descriptor that will be used by the DMA controller
|
||||||
for (int buf_idx = 0; buf_idx < DMA_BUF_COUNT; buf_idx++) {
|
for (int buf_idx = 0; buf_idx < DMA_BUF_COUNT; buf_idx++) {
|
||||||
|
|||||||
@@ -30,9 +30,13 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAS_TMC_SW_SERIAL
|
#if HAS_TMC_SW_SERIAL
|
||||||
#error "TMC220x Software Serial is not supported on this platform."
|
#error "TMC220x Software Serial is not supported on ESP32."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if BOTH(WIFISUPPORT, ESP3D_WIFISUPPORT)
|
#if BOTH(WIFISUPPORT, ESP3D_WIFISUPPORT)
|
||||||
#error "Only enable one WiFi option, either WIFISUPPORT or ESP3D_WIFISUPPORT."
|
#error "Only enable one WiFi option, either WIFISUPPORT or ESP3D_WIFISUPPORT."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if ENABLED(POSTMORTEM_DEBUGGING)
|
||||||
|
#error "POSTMORTEM_DEBUGGING is not yet supported on ESP32."
|
||||||
|
#endif
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* 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
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#define SS_PIN SDSS
|
#define SD_SS_PIN SDSS
|
||||||
#define SCK_PIN 18
|
#define SD_SCK_PIN 18
|
||||||
#define MISO_PIN 19
|
#define SD_MISO_PIN 19
|
||||||
#define MOSI_PIN 23
|
#define SD_MOSI_PIN 23
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ const tTimerConfig TimerConfig [NUM_HARDWARE_TIMERS] = {
|
|||||||
{ TIMER_GROUP_0, TIMER_0, STEPPER_TIMER_PRESCALE, stepTC_Handler }, // 0 - Stepper
|
{ TIMER_GROUP_0, TIMER_0, STEPPER_TIMER_PRESCALE, stepTC_Handler }, // 0 - Stepper
|
||||||
{ TIMER_GROUP_0, TIMER_1, TEMP_TIMER_PRESCALE, tempTC_Handler }, // 1 - Temperature
|
{ TIMER_GROUP_0, TIMER_1, TEMP_TIMER_PRESCALE, tempTC_Handler }, // 1 - Temperature
|
||||||
{ TIMER_GROUP_1, TIMER_0, PWM_TIMER_PRESCALE, pwmTC_Handler }, // 2 - PWM
|
{ TIMER_GROUP_1, TIMER_0, PWM_TIMER_PRESCALE, pwmTC_Handler }, // 2 - PWM
|
||||||
{ TIMER_GROUP_1, TIMER_1, 1, nullptr }, // 3
|
{ TIMER_GROUP_1, TIMER_1, TONE_TIMER_PRESCALE, toneTC_Handler }, // 3 - Tone
|
||||||
};
|
};
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|||||||
@@ -24,15 +24,9 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <driver/timer.h>
|
#include <driver/timer.h>
|
||||||
|
|
||||||
// Includes needed to get I2S_STEPPER_STREAM. Note that pins.h
|
|
||||||
// is included in case this header is being included early.
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
|
||||||
#include "../../pins/pins.h"
|
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Defines
|
// Defines
|
||||||
// ------------------------
|
// ------------------------
|
||||||
//
|
|
||||||
#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;
|
||||||
@@ -50,6 +44,9 @@ typedef uint64_t hal_timer_t;
|
|||||||
#ifndef PWM_TIMER_NUM
|
#ifndef PWM_TIMER_NUM
|
||||||
#define PWM_TIMER_NUM 2 // index of timer to use for PWM outputs
|
#define PWM_TIMER_NUM 2 // index of timer to use for PWM outputs
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef TONE_TIMER_NUM
|
||||||
|
#define TONE_TIMER_NUM 3 // index of timer for beeper tones
|
||||||
|
#endif
|
||||||
|
|
||||||
#define HAL_TIMER_RATE APB_CLK_FREQ // frequency of timer peripherals
|
#define HAL_TIMER_RATE APB_CLK_FREQ // frequency of timer peripherals
|
||||||
|
|
||||||
@@ -65,6 +62,8 @@ typedef uint64_t hal_timer_t;
|
|||||||
|
|
||||||
#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 TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz
|
#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz
|
||||||
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
||||||
|
|
||||||
@@ -96,10 +95,16 @@ typedef uint64_t hal_timer_t;
|
|||||||
#ifndef HAL_PWM_TIMER_ISR
|
#ifndef HAL_PWM_TIMER_ISR
|
||||||
#define HAL_PWM_TIMER_ISR() extern "C" void pwmTC_Handler()
|
#define HAL_PWM_TIMER_ISR() extern "C" void pwmTC_Handler()
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef HAL_TONE_TIMER_ISR
|
||||||
|
#define HAL_TONE_TIMER_ISR() extern "C" void toneTC_Handler()
|
||||||
|
#endif
|
||||||
|
|
||||||
extern "C" void tempTC_Handler();
|
extern "C" {
|
||||||
extern "C" void stepTC_Handler();
|
void tempTC_Handler();
|
||||||
extern "C" void pwmTC_Handler();
|
void stepTC_Handler();
|
||||||
|
void pwmTC_Handler();
|
||||||
|
void toneTC_Handler();
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Types
|
// Types
|
||||||
|
|||||||
@@ -25,6 +25,8 @@
|
|||||||
|
|
||||||
#if ENABLED(USE_WATCHDOG)
|
#if ENABLED(USE_WATCHDOG)
|
||||||
|
|
||||||
|
#define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout
|
||||||
|
|
||||||
#include "watchdog.h"
|
#include "watchdog.h"
|
||||||
|
|
||||||
void watchdogSetup() {
|
void watchdogSetup() {
|
||||||
|
|||||||
@@ -23,12 +23,16 @@
|
|||||||
|
|
||||||
#include "platforms.h"
|
#include "platforms.h"
|
||||||
|
|
||||||
|
#ifndef GCC_VERSION
|
||||||
|
#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
|
||||||
|
#endif
|
||||||
|
|
||||||
#include HAL_PATH(.,HAL.h)
|
#include HAL_PATH(.,HAL.h)
|
||||||
|
|
||||||
#define HAL_ADC_RANGE _BV(HAL_ADC_RESOLUTION)
|
#define HAL_ADC_RANGE _BV(HAL_ADC_RESOLUTION)
|
||||||
|
|
||||||
#ifndef I2C_ADDRESS
|
#ifndef I2C_ADDRESS
|
||||||
#define I2C_ADDRESS(A) (A)
|
#define I2C_ADDRESS(A) uint8_t(A)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Needed for AVR sprintf_P PROGMEM extension
|
// Needed for AVR sprintf_P PROGMEM extension
|
||||||
@@ -38,7 +42,7 @@
|
|||||||
|
|
||||||
// String helper
|
// String helper
|
||||||
#ifndef PGMSTR
|
#ifndef PGMSTR
|
||||||
#define PGMSTR(NAM,STR) constexpr char NAM[] = STR
|
#define PGMSTR(NAM,STR) const char NAM[] = STR
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
inline void watchdog_refresh() {
|
inline void watchdog_refresh() {
|
||||||
|
|||||||
@@ -24,21 +24,16 @@
|
|||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
#include "../shared/Delay.h"
|
#include "../shared/Delay.h"
|
||||||
|
|
||||||
HalSerial usb_serial;
|
MSerialT usb_serial(TERN0(EMERGENCY_PARSER, true));
|
||||||
|
|
||||||
// U8glib required functions
|
// U8glib required functions
|
||||||
extern "C" void u8g_xMicroDelay(uint16_t val) {
|
extern "C" {
|
||||||
DELAY_US(val);
|
void u8g_xMicroDelay(uint16_t val) { DELAY_US(val); }
|
||||||
}
|
void u8g_MicroDelay() { u8g_xMicroDelay(1); }
|
||||||
extern "C" void u8g_MicroDelay() {
|
void u8g_10MicroDelay() { u8g_xMicroDelay(10); }
|
||||||
u8g_xMicroDelay(1);
|
void u8g_Delay(uint16_t val) { delay(val); }
|
||||||
}
|
|
||||||
extern "C" void u8g_10MicroDelay() {
|
|
||||||
u8g_xMicroDelay(10);
|
|
||||||
}
|
|
||||||
extern "C" void u8g_Delay(uint16_t val) {
|
|
||||||
delay(val);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//************************//
|
//************************//
|
||||||
|
|
||||||
// return free heap space
|
// return free heap space
|
||||||
@@ -78,4 +73,6 @@ void HAL_pwm_init() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HAL_reboot() { /* Reset the application state and GPIO */ }
|
||||||
|
|
||||||
#endif // __PLAT_LINUX__
|
#endif // __PLAT_LINUX__
|
||||||
|
|||||||
+14
-12
@@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
#define CPU_32_BIT
|
#define CPU_32_BIT
|
||||||
|
|
||||||
#define F_CPU 100000000
|
#define F_CPU 100000000UL
|
||||||
#define SystemCoreClock F_CPU
|
#define SystemCoreClock F_CPU
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
@@ -60,9 +60,8 @@ uint8_t _getc();
|
|||||||
|
|
||||||
#define SHARED_SERVOS HAS_SERVOS
|
#define SHARED_SERVOS HAS_SERVOS
|
||||||
|
|
||||||
extern HalSerial usb_serial;
|
extern MSerialT usb_serial;
|
||||||
#define MYSERIAL0 usb_serial
|
#define MYSERIAL1 usb_serial
|
||||||
#define NUM_SERIAL 1
|
|
||||||
|
|
||||||
#define ST7920_DELAY_1 DELAY_NS(600)
|
#define ST7920_DELAY_1 DELAY_NS(600)
|
||||||
#define ST7920_DELAY_2 DELAY_NS(750)
|
#define ST7920_DELAY_2 DELAY_NS(750)
|
||||||
@@ -80,10 +79,16 @@ extern HalSerial usb_serial;
|
|||||||
inline void HAL_init() {}
|
inline void HAL_init() {}
|
||||||
|
|
||||||
// Utility functions
|
// Utility functions
|
||||||
#pragma GCC diagnostic push
|
#if GCC_VERSION <= 50000
|
||||||
#pragma GCC diagnostic ignored "-Wunused-function"
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wunused-function"
|
||||||
|
#endif
|
||||||
|
|
||||||
int freeMemory();
|
int freeMemory();
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
|
#if GCC_VERSION <= 50000
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
|
||||||
// ADC
|
// ADC
|
||||||
#define HAL_ADC_VREF 5.0
|
#define HAL_ADC_VREF 5.0
|
||||||
@@ -102,12 +107,9 @@ uint16_t HAL_adc_get_result();
|
|||||||
inline void HAL_clear_reset_source(void) {}
|
inline void HAL_clear_reset_source(void) {}
|
||||||
inline uint8_t HAL_get_reset_source(void) { return RST_POWER_ON; }
|
inline uint8_t HAL_get_reset_source(void) { return RST_POWER_ON; }
|
||||||
|
|
||||||
|
void HAL_reboot(); // Reset the application state and GPIO
|
||||||
|
|
||||||
/* ---------------- Delay in cycles */
|
/* ---------------- Delay in cycles */
|
||||||
FORCE_INLINE static void DELAY_CYCLES(uint64_t x) {
|
FORCE_INLINE static void DELAY_CYCLES(uint64_t x) {
|
||||||
Clock::delayCycles(x);
|
Clock::delayCycles(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add strcmp_P if missing
|
|
||||||
#ifndef strcmp_P
|
|
||||||
#define strcmp_P(a, b) strcmp((a), (b))
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; }
|
|||||||
bool PersistentStore::access_start() {
|
bool PersistentStore::access_start() {
|
||||||
const char eeprom_erase_value = 0xFF;
|
const char eeprom_erase_value = 0xFF;
|
||||||
FILE * eeprom_file = fopen(filename, "rb");
|
FILE * eeprom_file = fopen(filename, "rb");
|
||||||
if (eeprom_file == nullptr) return false;
|
if (!eeprom_file) return false;
|
||||||
|
|
||||||
fseek(eeprom_file, 0L, SEEK_END);
|
fseek(eeprom_file, 0L, SEEK_END);
|
||||||
std::size_t file_size = ftell(eeprom_file);
|
std::size_t file_size = ftell(eeprom_file);
|
||||||
@@ -59,7 +59,7 @@ bool PersistentStore::access_start() {
|
|||||||
|
|
||||||
bool PersistentStore::access_finish() {
|
bool PersistentStore::access_finish() {
|
||||||
FILE * eeprom_file = fopen(filename, "wb");
|
FILE * eeprom_file = fopen(filename, "wb");
|
||||||
if (eeprom_file == nullptr) return false;
|
if (!eeprom_file) return false;
|
||||||
fwrite(buffer, sizeof(uint8_t), sizeof(buffer), eeprom_file);
|
fwrite(buffer, sizeof(uint8_t), sizeof(buffer), eeprom_file);
|
||||||
fclose(eeprom_file);
|
fclose(eeprom_file);
|
||||||
return true;
|
return true;
|
||||||
@@ -78,7 +78,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
|
|||||||
return (bytes_written != size); // return true for any error
|
return (bytes_written != size); // return true for any error
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PersistentStore::read_data(int &pos, uint8_t* value, const size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
bool PersistentStore::read_data(int &pos, uint8_t *value, const size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
||||||
std::size_t bytes_read = 0;
|
std::size_t bytes_read = 0;
|
||||||
if (writing) {
|
if (writing) {
|
||||||
for (std::size_t i = 0; i < size; i++) {
|
for (std::size_t i = 0; i < size; i++) {
|
||||||
|
|||||||
@@ -86,10 +86,10 @@ public:
|
|||||||
GpioEvent::Type evt_type = value > 1 ? GpioEvent::SET_VALUE : value > pin_map[pin].value ? GpioEvent::RISE : value < pin_map[pin].value ? GpioEvent::FALL : GpioEvent::NOP;
|
GpioEvent::Type evt_type = value > 1 ? GpioEvent::SET_VALUE : value > pin_map[pin].value ? GpioEvent::RISE : value < pin_map[pin].value ? GpioEvent::FALL : GpioEvent::NOP;
|
||||||
pin_map[pin].value = value;
|
pin_map[pin].value = value;
|
||||||
GpioEvent evt(Clock::nanos(), pin, evt_type);
|
GpioEvent evt(Clock::nanos(), pin, evt_type);
|
||||||
if (pin_map[pin].cb != nullptr) {
|
if (pin_map[pin].cb) {
|
||||||
pin_map[pin].cb->interrupt(evt);
|
pin_map[pin].cb->interrupt(evt);
|
||||||
}
|
}
|
||||||
if (Gpio::logger != nullptr) Gpio::logger->log(evt);
|
if (Gpio::logger) Gpio::logger->log(evt);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint16_t get(pin_type pin) {
|
static uint16_t get(pin_type pin) {
|
||||||
@@ -105,8 +105,8 @@ public:
|
|||||||
if (!valid_pin(pin)) return;
|
if (!valid_pin(pin)) return;
|
||||||
pin_map[pin].mode = value;
|
pin_map[pin].mode = value;
|
||||||
GpioEvent evt(Clock::nanos(), pin, GpioEvent::Type::SETM);
|
GpioEvent evt(Clock::nanos(), pin, GpioEvent::Type::SETM);
|
||||||
if (pin_map[pin].cb != nullptr) pin_map[pin].cb->interrupt(evt);
|
if (pin_map[pin].cb) pin_map[pin].cb->interrupt(evt);
|
||||||
if (Gpio::logger != nullptr) Gpio::logger->log(evt);
|
if (Gpio::logger) Gpio::logger->log(evt);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t getMode(pin_type pin) {
|
static uint8_t getMode(pin_type pin) {
|
||||||
@@ -118,8 +118,8 @@ public:
|
|||||||
if (!valid_pin(pin)) return;
|
if (!valid_pin(pin)) return;
|
||||||
pin_map[pin].dir = value;
|
pin_map[pin].dir = value;
|
||||||
GpioEvent evt(Clock::nanos(), pin, GpioEvent::Type::SETD);
|
GpioEvent evt(Clock::nanos(), pin, GpioEvent::Type::SETD);
|
||||||
if (pin_map[pin].cb != nullptr) pin_map[pin].cb->interrupt(evt);
|
if (pin_map[pin].cb) pin_map[pin].cb->interrupt(evt);
|
||||||
if (Gpio::logger != nullptr) Gpio::logger->log(evt);
|
if (Gpio::logger) Gpio::logger->log(evt);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t getDir(pin_type pin) {
|
static uint8_t getDir(pin_type pin) {
|
||||||
|
|||||||
@@ -35,5 +35,9 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAS_TMC_SW_SERIAL
|
#if HAS_TMC_SW_SERIAL
|
||||||
#error "TMC220x Software Serial is not supported on this platform."
|
#error "TMC220x Software Serial is not supported on LINUX."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if ENABLED(POSTMORTEM_DEBUGGING)
|
||||||
|
#error "POSTMORTEM_DEBUGGING is not yet supported on LINUX."
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -67,34 +67,14 @@ void cli(); // Disable
|
|||||||
void sei(); // Enable
|
void sei(); // Enable
|
||||||
void attachInterrupt(uint32_t pin, void (*callback)(), uint32_t mode);
|
void attachInterrupt(uint32_t pin, void (*callback)(), uint32_t mode);
|
||||||
void detachInterrupt(uint32_t pin);
|
void detachInterrupt(uint32_t pin);
|
||||||
extern "C" void GpioEnableInt(uint32_t port, uint32_t pin, uint32_t mode);
|
|
||||||
extern "C" void GpioDisableInt(uint32_t port, uint32_t pin);
|
|
||||||
|
|
||||||
// Program Memory
|
extern "C" {
|
||||||
#define pgm_read_ptr(addr) (*((void**)(addr)))
|
void GpioEnableInt(uint32_t port, uint32_t pin, uint32_t mode);
|
||||||
#define pgm_read_byte_near(addr) (*((uint8_t*)(addr)))
|
void GpioDisableInt(uint32_t port, uint32_t pin);
|
||||||
#define pgm_read_float_near(addr) (*((float*)(addr)))
|
}
|
||||||
#define pgm_read_word_near(addr) (*((uint16_t*)(addr)))
|
|
||||||
#define pgm_read_dword_near(addr) (*((uint32_t*)(addr)))
|
|
||||||
#define pgm_read_byte(addr) pgm_read_byte_near(addr)
|
|
||||||
#define pgm_read_float(addr) pgm_read_float_near(addr)
|
|
||||||
#define pgm_read_word(addr) pgm_read_word_near(addr)
|
|
||||||
#define pgm_read_dword(addr) pgm_read_dword_near(addr)
|
|
||||||
|
|
||||||
using std::memcpy;
|
|
||||||
#define memcpy_P memcpy
|
|
||||||
#define sprintf_P sprintf
|
|
||||||
#define strstr_P strstr
|
|
||||||
#define strncpy_P strncpy
|
|
||||||
#define vsnprintf_P vsnprintf
|
|
||||||
#define strcpy_P strcpy
|
|
||||||
#define snprintf_P snprintf
|
|
||||||
#define strlen_P strlen
|
|
||||||
|
|
||||||
// Time functions
|
// Time functions
|
||||||
extern "C" {
|
extern "C" void delay(const int milis);
|
||||||
void delay(const int milis);
|
|
||||||
}
|
|
||||||
void _delay_ms(const int delay);
|
void _delay_ms(const int delay);
|
||||||
void delayMicroseconds(unsigned long);
|
void delayMicroseconds(unsigned long);
|
||||||
uint32_t millis();
|
uint32_t millis();
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
#if ENABLED(EMERGENCY_PARSER)
|
#if ENABLED(EMERGENCY_PARSER)
|
||||||
#include "../../../feature/e_parser.h"
|
#include "../../../feature/e_parser.h"
|
||||||
#endif
|
#endif
|
||||||
|
#include "../../../core/serial_hook.h"
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -33,7 +34,6 @@
|
|||||||
* Generic RingBuffer
|
* Generic RingBuffer
|
||||||
* T type of the buffer array
|
* T type of the buffer array
|
||||||
* S size of the buffer (must be power of 2)
|
* S size of the buffer (must be power of 2)
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
template <typename T, uint32_t S> class RingBuffer {
|
template <typename T, uint32_t S> class RingBuffer {
|
||||||
public:
|
public:
|
||||||
@@ -74,18 +74,11 @@ private:
|
|||||||
volatile uint32_t index_read;
|
volatile uint32_t index_read;
|
||||||
};
|
};
|
||||||
|
|
||||||
class HalSerial {
|
struct HalSerial {
|
||||||
public:
|
|
||||||
|
|
||||||
#if ENABLED(EMERGENCY_PARSER)
|
|
||||||
EmergencyParser::State emergency_state;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
HalSerial() { host_connected = true; }
|
HalSerial() { host_connected = true; }
|
||||||
|
|
||||||
void begin(int32_t) {}
|
void begin(int32_t) {}
|
||||||
|
void end() {}
|
||||||
void end() {}
|
|
||||||
|
|
||||||
int peek() {
|
int peek() {
|
||||||
uint8_t value;
|
uint8_t value;
|
||||||
@@ -100,7 +93,7 @@ public:
|
|||||||
return transmit_buffer.write(c);
|
return transmit_buffer.write(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
operator bool() { return host_connected; }
|
bool connected() { return host_connected; }
|
||||||
|
|
||||||
uint16_t available() {
|
uint16_t available() {
|
||||||
return (uint16_t)receive_buffer.available();
|
return (uint16_t)receive_buffer.available();
|
||||||
@@ -117,92 +110,9 @@ public:
|
|||||||
while (transmit_buffer.available()) { /* nada */ }
|
while (transmit_buffer.available()) { /* nada */ }
|
||||||
}
|
}
|
||||||
|
|
||||||
void printf(const char *format, ...) {
|
|
||||||
static char buffer[256];
|
|
||||||
va_list vArgs;
|
|
||||||
va_start(vArgs, format);
|
|
||||||
int length = vsnprintf((char *) buffer, 256, (char const *) format, vArgs);
|
|
||||||
va_end(vArgs);
|
|
||||||
if (length > 0 && length < 256) {
|
|
||||||
if (host_connected) {
|
|
||||||
for (int i = 0; i < length;) {
|
|
||||||
if (transmit_buffer.write(buffer[i])) {
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DEC 10
|
|
||||||
#define HEX 16
|
|
||||||
#define OCT 8
|
|
||||||
#define BIN 2
|
|
||||||
|
|
||||||
void print_bin(uint32_t value, uint8_t num_digits) {
|
|
||||||
uint32_t mask = 1 << (num_digits -1);
|
|
||||||
for (uint8_t i = 0; i < num_digits; i++) {
|
|
||||||
if (!(i % 4) && i) write(' ');
|
|
||||||
if (!(i % 16) && i) write(' ');
|
|
||||||
if (value & mask) write('1');
|
|
||||||
else write('0');
|
|
||||||
value <<= 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void print(const char value[]) { printf("%s" , value); }
|
|
||||||
void print(char value, int nbase = 0) {
|
|
||||||
if (nbase == BIN) print_bin(value, 8);
|
|
||||||
else if (nbase == OCT) printf("%3o", value);
|
|
||||||
else if (nbase == HEX) printf("%2X", value);
|
|
||||||
else if (nbase == DEC ) printf("%d", value);
|
|
||||||
else printf("%c" , value);
|
|
||||||
}
|
|
||||||
void print(unsigned char value, int nbase = 0) {
|
|
||||||
if (nbase == BIN) print_bin(value, 8);
|
|
||||||
else if (nbase == OCT) printf("%3o", value);
|
|
||||||
else if (nbase == HEX) printf("%2X", value);
|
|
||||||
else printf("%u" , value);
|
|
||||||
}
|
|
||||||
void print(int value, int nbase = 0) {
|
|
||||||
if (nbase == BIN) print_bin(value, 16);
|
|
||||||
else if (nbase == OCT) printf("%6o", value);
|
|
||||||
else if (nbase == HEX) printf("%4X", value);
|
|
||||||
else printf("%d", value);
|
|
||||||
}
|
|
||||||
void print(unsigned int value, int nbase = 0) {
|
|
||||||
if (nbase == BIN) print_bin(value, 16);
|
|
||||||
else if (nbase == OCT) printf("%6o", value);
|
|
||||||
else if (nbase == HEX) printf("%4X", value);
|
|
||||||
else printf("%u" , value);
|
|
||||||
}
|
|
||||||
void print(long value, int nbase = 0) {
|
|
||||||
if (nbase == BIN) print_bin(value, 32);
|
|
||||||
else if (nbase == OCT) printf("%11o", value);
|
|
||||||
else if (nbase == HEX) printf("%8X", value);
|
|
||||||
else printf("%ld" , value);
|
|
||||||
}
|
|
||||||
void print(unsigned long value, int nbase = 0) {
|
|
||||||
if (nbase == BIN) print_bin(value, 32);
|
|
||||||
else if (nbase == OCT) printf("%11o", value);
|
|
||||||
else if (nbase == HEX) printf("%8X", value);
|
|
||||||
else printf("%lu" , value);
|
|
||||||
}
|
|
||||||
void print(float value, int round = 6) { printf("%f" , value); }
|
|
||||||
void print(double value, int round = 6) { printf("%f" , value); }
|
|
||||||
|
|
||||||
void println(const char value[]) { printf("%s\n" , value); }
|
|
||||||
void println(char value, int nbase = 0) { print(value, nbase); println(); }
|
|
||||||
void println(unsigned char value, int nbase = 0) { print(value, nbase); println(); }
|
|
||||||
void println(int value, int nbase = 0) { print(value, nbase); println(); }
|
|
||||||
void println(unsigned int value, int nbase = 0) { print(value, nbase); println(); }
|
|
||||||
void println(long value, int nbase = 0) { print(value, nbase); println(); }
|
|
||||||
void println(unsigned long value, int nbase = 0) { print(value, nbase); println(); }
|
|
||||||
void println(float value, int round = 6) { printf("%f\n" , value); }
|
|
||||||
void println(double value, int round = 6) { printf("%f\n" , value); }
|
|
||||||
void println() { print('\n'); }
|
|
||||||
|
|
||||||
volatile RingBuffer<uint8_t, 128> receive_buffer;
|
volatile RingBuffer<uint8_t, 128> receive_buffer;
|
||||||
volatile RingBuffer<uint8_t, 128> transmit_buffer;
|
volatile RingBuffer<uint8_t, 128> transmit_buffer;
|
||||||
volatile bool host_connected;
|
volatile bool host_connected;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef Serial1Class<HalSerial> MSerialT;
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Marlin 3D Printer Firmware
|
* Marlin 3D Printer Firmware
|
||||||
*
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
@@ -19,22 +18,23 @@
|
|||||||
*/
|
*/
|
||||||
#ifdef __PLAT_LINUX__
|
#ifdef __PLAT_LINUX__
|
||||||
|
|
||||||
extern void setup();
|
//#define GPIO_LOGGING // Full GPIO and Positional Logging
|
||||||
extern void loop();
|
|
||||||
|
|
||||||
#include <thread>
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include "../shared/Delay.h"
|
#include "../shared/Delay.h"
|
||||||
#include "hardware/IOLoggerCSV.h"
|
#include "hardware/IOLoggerCSV.h"
|
||||||
#include "hardware/Heater.h"
|
#include "hardware/Heater.h"
|
||||||
#include "hardware/LinearAxis.h"
|
#include "hardware/LinearAxis.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <thread>
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
extern void setup();
|
||||||
|
extern void loop();
|
||||||
|
|
||||||
// simple stdout / stdin implementation for fake serial port
|
// simple stdout / stdin implementation for fake serial port
|
||||||
void write_serial_thread() {
|
void write_serial_thread() {
|
||||||
for (;;) {
|
for (;;) {
|
||||||
@@ -64,8 +64,6 @@ void simulation_loop() {
|
|||||||
LinearAxis z_axis(Z_ENABLE_PIN, Z_DIR_PIN, Z_STEP_PIN, Z_MIN_PIN, Z_MAX_PIN);
|
LinearAxis z_axis(Z_ENABLE_PIN, Z_DIR_PIN, Z_STEP_PIN, Z_MIN_PIN, Z_MAX_PIN);
|
||||||
LinearAxis extruder0(E0_ENABLE_PIN, E0_DIR_PIN, E0_STEP_PIN, P_NC, P_NC);
|
LinearAxis extruder0(E0_ENABLE_PIN, E0_DIR_PIN, E0_STEP_PIN, P_NC, P_NC);
|
||||||
|
|
||||||
//#define GPIO_LOGGING // Full GPIO and Positional Logging
|
|
||||||
|
|
||||||
#ifdef GPIO_LOGGING
|
#ifdef GPIO_LOGGING
|
||||||
IOLoggerCSV logger("all_gpio_log.csv");
|
IOLoggerCSV logger("all_gpio_log.csv");
|
||||||
Gpio::attachLogger(&logger);
|
Gpio::attachLogger(&logger);
|
||||||
@@ -88,7 +86,7 @@ void simulation_loop() {
|
|||||||
|
|
||||||
#ifdef GPIO_LOGGING
|
#ifdef GPIO_LOGGING
|
||||||
if (x_axis.position != x || y_axis.position != y || z_axis.position != z) {
|
if (x_axis.position != x || y_axis.position != y || z_axis.position != z) {
|
||||||
uint64_t update = MAX3(x_axis.last_update, y_axis.last_update, z_axis.last_update);
|
uint64_t update = _MAX(x_axis.last_update, y_axis.last_update, z_axis.last_update);
|
||||||
position_log << update << ", " << x_axis.position << ", " << y_axis.position << ", " << z_axis.position << std::endl;
|
position_log << update << ", " << x_axis.position << ", " << y_axis.position << ", " << z_axis.position << std::endl;
|
||||||
position_log.flush();
|
position_log.flush();
|
||||||
x = x_axis.position;
|
x = x_axis.position;
|
||||||
@@ -107,8 +105,8 @@ int main() {
|
|||||||
std::thread write_serial (write_serial_thread);
|
std::thread write_serial (write_serial_thread);
|
||||||
std::thread read_serial (read_serial_thread);
|
std::thread read_serial (read_serial_thread);
|
||||||
|
|
||||||
#if NUM_SERIAL > 0
|
#ifdef MYSERIAL1
|
||||||
MYSERIAL0.begin(BAUDRATE);
|
MYSERIAL1.begin(BAUDRATE);
|
||||||
SERIAL_ECHOLNPGM("x86_64 Initialized");
|
SERIAL_ECHOLNPGM("x86_64 Initialized");
|
||||||
SERIAL_FLUSHTX();
|
SERIAL_FLUSHTX();
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -26,15 +26,15 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS
|
#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS
|
||||||
#define pwm_details(pin) pin = pin // do nothing // print PWM details
|
#define pwm_details(pin) NOOP // (do nothing)
|
||||||
#define pwm_status(pin) false //Print a pin's PWM status. Return true if it's currently a PWM pin.
|
#define pwm_status(pin) false // Print a pin's PWM status. Return true if it's currently a PWM pin.
|
||||||
#define IS_ANALOG(P) (DIGITAL_PIN_TO_ANALOG_PIN(P) >= 0 ? 1 : 0)
|
#define IS_ANALOG(P) (DIGITAL_PIN_TO_ANALOG_PIN(P) >= 0 ? 1 : 0)
|
||||||
#define digitalRead_mod(p) digitalRead(p)
|
#define digitalRead_mod(p) digitalRead(p)
|
||||||
#define PRINT_PORT(p)
|
#define PRINT_PORT(p)
|
||||||
#define GET_ARRAY_PIN(p) pin_array[p].pin
|
#define GET_ARRAY_PIN(p) pin_array[p].pin
|
||||||
#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0)
|
#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0)
|
||||||
#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3d "), p); SERIAL_ECHO(buffer); }while(0)
|
#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3d "), p); SERIAL_ECHO(buffer); }while(0)
|
||||||
#define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin
|
#define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin
|
||||||
|
|
||||||
// active ADC function/mode/code values for PINSEL registers
|
// active ADC function/mode/code values for PINSEL registers
|
||||||
constexpr int8_t ADC_pin_mode(pin_t pin) {
|
constexpr int8_t ADC_pin_mode(pin_t pin) {
|
||||||
|
|||||||
@@ -45,7 +45,6 @@
|
|||||||
* Version 2 Copyright (c) 2009 Michael Margolis. All right reserved.
|
* Version 2 Copyright (c) 2009 Michael Margolis. All right reserved.
|
||||||
*
|
*
|
||||||
* The only modification was to update/delete macros to match the LPC176x.
|
* The only modification was to update/delete macros to match the LPC176x.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|||||||
@@ -24,31 +24,32 @@
|
|||||||
#include "../../core/macros.h"
|
#include "../../core/macros.h"
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
#if BOTH(HAS_GRAPHICAL_LCD, SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN || LCD_PINS_ENABLE == MOSI_PIN || DOGLCD_SCK == SCK_PIN || DOGLCD_MOSI == MOSI_PIN)
|
#if BOTH(HAS_MARLINUI_U8GLIB, SDSUPPORT) && (LCD_PINS_D4 == SD_SCK_PIN || LCD_PINS_ENABLE == SD_MOSI_PIN || DOGLCD_SCK == SD_SCK_PIN || DOGLCD_MOSI == SD_MOSI_PIN)
|
||||||
#define LPC_SOFTWARE_SPI // If the SD card and LCD adapter share the same SPI pins, then software SPI is currently
|
#define LPC_SOFTWARE_SPI // If the SD card and LCD adapter share the same SPI pins, then software SPI is currently
|
||||||
// needed due to the speed and mode required for communicating with each device being different.
|
// needed due to the speed and mode required for communicating with each device being different.
|
||||||
// This requirement can be removed if the SPI access to these devices is updated to use
|
// This requirement can be removed if the SPI access to these devices is updated to use
|
||||||
// spiBeginTransaction.
|
// spiBeginTransaction.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/** onboard SD card */
|
// Onboard SD
|
||||||
//#define SCK_PIN P0_07
|
//#define SD_SCK_PIN P0_07
|
||||||
//#define MISO_PIN P0_08
|
//#define SD_MISO_PIN P0_08
|
||||||
//#define MOSI_PIN P0_09
|
//#define SD_MOSI_PIN P0_09
|
||||||
//#define SS_PIN P0_06
|
//#define SD_SS_PIN P0_06
|
||||||
/** external */
|
|
||||||
#ifndef SCK_PIN
|
// External SD
|
||||||
#define SCK_PIN 50
|
#ifndef SD_SCK_PIN
|
||||||
|
#define SD_SCK_PIN 50
|
||||||
#endif
|
#endif
|
||||||
#ifndef MISO_PIN
|
#ifndef SD_MISO_PIN
|
||||||
#define MISO_PIN 51
|
#define SD_MISO_PIN 51
|
||||||
#endif
|
#endif
|
||||||
#ifndef MOSI_PIN
|
#ifndef SD_MOSI_PIN
|
||||||
#define MOSI_PIN 52
|
#define SD_MOSI_PIN 52
|
||||||
#endif
|
#endif
|
||||||
#ifndef SS_PIN
|
#ifndef SD_SS_PIN
|
||||||
#define SS_PIN 53
|
#define SD_SS_PIN 53
|
||||||
#endif
|
#endif
|
||||||
#ifndef SDSS
|
#ifndef SDSS
|
||||||
#define SDSS SS_PIN
|
#define SDSS SD_SS_PIN
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -27,6 +27,8 @@
|
|||||||
|
|
||||||
#include "watchdog.h"
|
#include "watchdog.h"
|
||||||
|
|
||||||
|
#define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout
|
||||||
|
|
||||||
void watchdog_init() {}
|
void watchdog_init() {}
|
||||||
void HAL_watchdog_refresh() {}
|
void HAL_watchdog_refresh() {}
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,5 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#define WDT_TIMEOUT 4000000 // 4 second timeout
|
|
||||||
|
|
||||||
void watchdog_init();
|
void watchdog_init();
|
||||||
void HAL_watchdog_refresh();
|
void HAL_watchdog_refresh();
|
||||||
|
|||||||
@@ -1,322 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifdef TARGET_LPC1768
|
|
||||||
|
|
||||||
#include "../../core/macros.h"
|
|
||||||
#include "../../core/serial.h"
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "../shared/backtrace/unwinder.h"
|
|
||||||
#include "../shared/backtrace/unwmemaccess.h"
|
|
||||||
#include "watchdog.h"
|
|
||||||
#include <debug_frmwrk.h>
|
|
||||||
|
|
||||||
|
|
||||||
// Debug monitor that dumps to the Programming port all status when
|
|
||||||
// an exception or WDT timeout happens - And then resets the board
|
|
||||||
|
|
||||||
// All the Monitor routines must run with interrupts disabled and
|
|
||||||
// under an ISR execution context. That is why we cannot reuse the
|
|
||||||
// Serial interrupt routines or any C runtime, as we don't know the
|
|
||||||
// state we are when running them
|
|
||||||
|
|
||||||
// A SW memory barrier, to ensure GCC does not overoptimize loops
|
|
||||||
#define sw_barrier() __asm__ volatile("": : :"memory");
|
|
||||||
|
|
||||||
// (re)initialize UART0 as a monitor output to 250000,n,8,1
|
|
||||||
static void TXBegin() {
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send character through UART with no interrupts
|
|
||||||
static void TX(char c) {
|
|
||||||
_DBC(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send String through UART
|
|
||||||
static void TX(const char* s) {
|
|
||||||
while (*s) TX(*s++);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void TXDigit(uint32_t d) {
|
|
||||||
if (d < 10) TX((char)(d+'0'));
|
|
||||||
else if (d < 16) TX((char)(d+'A'-10));
|
|
||||||
else TX('?');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send Hex number thru UART
|
|
||||||
static void TXHex(uint32_t v) {
|
|
||||||
TX("0x");
|
|
||||||
for (uint8_t i = 0; i < 8; i++, v <<= 4)
|
|
||||||
TXDigit((v >> 28) & 0xF);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send Decimal number thru UART
|
|
||||||
static void TXDec(uint32_t v) {
|
|
||||||
if (!v) {
|
|
||||||
TX('0');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
char nbrs[14];
|
|
||||||
char *p = &nbrs[0];
|
|
||||||
while (v != 0) {
|
|
||||||
*p++ = '0' + (v % 10);
|
|
||||||
v /= 10;
|
|
||||||
}
|
|
||||||
do {
|
|
||||||
p--;
|
|
||||||
TX(*p);
|
|
||||||
} while (p != &nbrs[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dump a backtrace entry
|
|
||||||
static bool UnwReportOut(void* ctx, const UnwReport* bte) {
|
|
||||||
int* p = (int*)ctx;
|
|
||||||
|
|
||||||
(*p)++;
|
|
||||||
TX('#'); TXDec(*p); TX(" : ");
|
|
||||||
TX(bte->name?bte->name:"unknown"); TX('@'); TXHex(bte->function);
|
|
||||||
TX('+'); TXDec(bte->address - bte->function);
|
|
||||||
TX(" PC:");TXHex(bte->address); TX('\n');
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef UNW_DEBUG
|
|
||||||
void UnwPrintf(const char* format, ...) {
|
|
||||||
char dest[256];
|
|
||||||
va_list argptr;
|
|
||||||
va_start(argptr, format);
|
|
||||||
vsprintf(dest, format, argptr);
|
|
||||||
va_end(argptr);
|
|
||||||
TX(&dest[0]);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Table of function pointers for passing to the unwinder */
|
|
||||||
static const UnwindCallbacks UnwCallbacks = {
|
|
||||||
UnwReportOut,
|
|
||||||
UnwReadW,
|
|
||||||
UnwReadH,
|
|
||||||
UnwReadB
|
|
||||||
#ifdef UNW_DEBUG
|
|
||||||
,UnwPrintf
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* HardFaultHandler_C:
|
|
||||||
* This is called from the HardFault_HandlerAsm with a pointer the Fault stack
|
|
||||||
* as the parameter. We can then read the values from the stack and place them
|
|
||||||
* into local variables for ease of reading.
|
|
||||||
* We then read the various Fault Status and Address Registers to help decode
|
|
||||||
* cause of the fault.
|
|
||||||
* The function ends with a BKPT instruction to force control back into the debugger
|
|
||||||
*/
|
|
||||||
extern "C"
|
|
||||||
void HardFault_HandlerC(unsigned long *sp, unsigned long lr, unsigned long cause) {
|
|
||||||
|
|
||||||
static const char* causestr[] = {
|
|
||||||
"NMI","Hard","Mem","Bus","Usage","Debug","WDT","RSTC"
|
|
||||||
};
|
|
||||||
|
|
||||||
UnwindFrame btf;
|
|
||||||
|
|
||||||
// Dump report to the Programming port (interrupts are DISABLED)
|
|
||||||
TXBegin();
|
|
||||||
TX("\n\n## Software Fault detected ##\n");
|
|
||||||
TX("Cause: "); TX(causestr[cause]); TX('\n');
|
|
||||||
|
|
||||||
TX("R0 : "); TXHex(((unsigned long)sp[0])); TX('\n');
|
|
||||||
TX("R1 : "); TXHex(((unsigned long)sp[1])); TX('\n');
|
|
||||||
TX("R2 : "); TXHex(((unsigned long)sp[2])); TX('\n');
|
|
||||||
TX("R3 : "); TXHex(((unsigned long)sp[3])); TX('\n');
|
|
||||||
TX("R12 : "); TXHex(((unsigned long)sp[4])); TX('\n');
|
|
||||||
TX("LR : "); TXHex(((unsigned long)sp[5])); TX('\n');
|
|
||||||
TX("PC : "); TXHex(((unsigned long)sp[6])); TX('\n');
|
|
||||||
TX("PSR : "); TXHex(((unsigned long)sp[7])); TX('\n');
|
|
||||||
|
|
||||||
// Configurable Fault Status Register
|
|
||||||
// Consists of MMSR, BFSR and UFSR
|
|
||||||
TX("CFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED28)))); TX('\n');
|
|
||||||
|
|
||||||
// Hard Fault Status Register
|
|
||||||
TX("HFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED2C)))); TX('\n');
|
|
||||||
|
|
||||||
// Debug Fault Status Register
|
|
||||||
TX("DFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED30)))); TX('\n');
|
|
||||||
|
|
||||||
// Auxiliary Fault Status Register
|
|
||||||
TX("AFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED3C)))); TX('\n');
|
|
||||||
|
|
||||||
// Read the Fault Address Registers. These may not contain valid values.
|
|
||||||
// Check BFARVALID/MMARVALID to see if they are valid values
|
|
||||||
// MemManage Fault Address Register
|
|
||||||
TX("MMAR : "); TXHex((*((volatile unsigned long *)(0xE000ED34)))); TX('\n');
|
|
||||||
|
|
||||||
// Bus Fault Address Register
|
|
||||||
TX("BFAR : "); TXHex((*((volatile unsigned long *)(0xE000ED38)))); TX('\n');
|
|
||||||
|
|
||||||
TX("ExcLR: "); TXHex(lr); TX('\n');
|
|
||||||
TX("ExcSP: "); TXHex((unsigned long)sp); TX('\n');
|
|
||||||
|
|
||||||
btf.sp = ((unsigned long)sp) + 8*4; // The original stack pointer
|
|
||||||
btf.fp = btf.sp;
|
|
||||||
btf.lr = ((unsigned long)sp[5]);
|
|
||||||
btf.pc = ((unsigned long)sp[6]) | 1; // Force Thumb, as CORTEX only support it
|
|
||||||
|
|
||||||
// Perform a backtrace
|
|
||||||
TX("\nBacktrace:\n\n");
|
|
||||||
int ctr = 0;
|
|
||||||
UnwindStart(&btf, &UnwCallbacks, &ctr);
|
|
||||||
|
|
||||||
// Disable all NVIC interrupts
|
|
||||||
NVIC->ICER[0] = 0xFFFFFFFF;
|
|
||||||
NVIC->ICER[1] = 0xFFFFFFFF;
|
|
||||||
|
|
||||||
// Relocate VTOR table to default position
|
|
||||||
SCB->VTOR = 0;
|
|
||||||
|
|
||||||
// Clear cause of reset to prevent entering smoothie bootstrap
|
|
||||||
HAL_clear_reset_source();
|
|
||||||
|
|
||||||
// Restart watchdog
|
|
||||||
#if ENABLED(USE_WATCHDOG)
|
|
||||||
//WDT_Restart(WDT);
|
|
||||||
watchdog_init();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Reset controller
|
|
||||||
NVIC_SystemReset();
|
|
||||||
|
|
||||||
// Nothing below here is compiled because NVIC_SystemReset loops forever
|
|
||||||
|
|
||||||
for (;;) { TERN_(USE_WATCHDOG, watchdog_init()); }
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
__attribute__((naked)) void NMI_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#0")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void HardFault_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#1")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void MemManage_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#2")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void BusFault_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#3")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void UsageFault_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#4")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void DebugMon_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#5")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This is NOT an exception, it is an interrupt handler - Nevertheless, the framing is the same */
|
|
||||||
__attribute__((naked)) void WDT_IRQHandler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#6")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void RSTC_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#7")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif // TARGET_LPC1768
|
|
||||||
@@ -29,21 +29,18 @@
|
|||||||
#include "watchdog.h"
|
#include "watchdog.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
DefaultSerial1 USBSerial(false, UsbSerial);
|
||||||
|
|
||||||
uint32_t HAL_adc_reading = 0;
|
uint32_t HAL_adc_reading = 0;
|
||||||
|
|
||||||
// U8glib required functions
|
// U8glib required functions
|
||||||
extern "C" void u8g_xMicroDelay(uint16_t val) {
|
extern "C" {
|
||||||
DELAY_US(val);
|
void u8g_xMicroDelay(uint16_t val) { DELAY_US(val); }
|
||||||
}
|
void u8g_MicroDelay() { u8g_xMicroDelay(1); }
|
||||||
extern "C" void u8g_MicroDelay() {
|
void u8g_10MicroDelay() { u8g_xMicroDelay(10); }
|
||||||
u8g_xMicroDelay(1);
|
void u8g_Delay(uint16_t val) { delay(val); }
|
||||||
}
|
|
||||||
extern "C" void u8g_10MicroDelay() {
|
|
||||||
u8g_xMicroDelay(10);
|
|
||||||
}
|
|
||||||
extern "C" void u8g_Delay(uint16_t val) {
|
|
||||||
delay(val);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//************************//
|
//************************//
|
||||||
|
|
||||||
// return free heap space
|
// return free heap space
|
||||||
@@ -66,7 +63,12 @@ int16_t PARSED_PIN_INDEX(const char code, const int16_t dval) {
|
|||||||
return ind > -1 ? ind : dval;
|
return ind > -1 ? ind : dval;
|
||||||
}
|
}
|
||||||
|
|
||||||
void flashFirmware(const int16_t) { NVIC_SystemReset(); }
|
void flashFirmware(const int16_t) {
|
||||||
|
delay(500); // Give OS time to disconnect
|
||||||
|
USB_Connect(false); // USB clear connection
|
||||||
|
delay(1000); // Give OS time to notice
|
||||||
|
HAL_reboot();
|
||||||
|
}
|
||||||
|
|
||||||
void HAL_clear_reset_source(void) {
|
void HAL_clear_reset_source(void) {
|
||||||
TERN_(USE_WATCHDOG, watchdog_clear_timeout_flag());
|
TERN_(USE_WATCHDOG, watchdog_clear_timeout_flag());
|
||||||
@@ -79,4 +81,6 @@ uint8_t HAL_get_reset_source(void) {
|
|||||||
return RST_POWER_ON;
|
return RST_POWER_ON;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HAL_reboot() { NVIC_SystemReset(); }
|
||||||
|
|
||||||
#endif // TARGET_LPC1768
|
#endif // TARGET_LPC1768
|
||||||
|
|||||||
@@ -47,9 +47,6 @@ extern "C" volatile uint32_t _millis;
|
|||||||
#include <pinmapping.h>
|
#include <pinmapping.h>
|
||||||
#include <CDCSerial.h>
|
#include <CDCSerial.h>
|
||||||
|
|
||||||
// i2c uses 8-bit shifted address
|
|
||||||
#define I2C_ADDRESS(A) uint8_t((A) << 1)
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Default graphical display delays
|
// Default graphical display delays
|
||||||
//
|
//
|
||||||
@@ -63,58 +60,60 @@ extern "C" volatile uint32_t _millis;
|
|||||||
#define ST7920_DELAY_3 DELAY_NS(750)
|
#define ST7920_DELAY_3 DELAY_NS(750)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
typedef ForwardSerial1Class< decltype(UsbSerial) > DefaultSerial1;
|
||||||
|
extern DefaultSerial1 USBSerial;
|
||||||
|
|
||||||
|
#define _MSERIAL(X) MSerial##X
|
||||||
|
#define MSERIAL(X) _MSERIAL(X)
|
||||||
|
|
||||||
#if SERIAL_PORT == -1
|
#if SERIAL_PORT == -1
|
||||||
#define MYSERIAL0 UsbSerial
|
#define MYSERIAL1 USBSerial
|
||||||
#elif SERIAL_PORT == 0
|
#elif WITHIN(SERIAL_PORT, 0, 3)
|
||||||
#define MYSERIAL0 MSerial
|
#define MYSERIAL1 MSERIAL(SERIAL_PORT)
|
||||||
#elif SERIAL_PORT == 1
|
|
||||||
#define MYSERIAL0 MSerial1
|
|
||||||
#elif SERIAL_PORT == 2
|
|
||||||
#define MYSERIAL0 MSerial2
|
|
||||||
#elif SERIAL_PORT == 3
|
|
||||||
#define MYSERIAL0 MSerial3
|
|
||||||
#else
|
#else
|
||||||
#error "SERIAL_PORT must be from -1 to 3. Please update your configuration."
|
#error "SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef SERIAL_PORT_2
|
#ifdef SERIAL_PORT_2
|
||||||
#if SERIAL_PORT_2 == SERIAL_PORT
|
#if SERIAL_PORT_2 == -1
|
||||||
#error "SERIAL_PORT_2 must be different than SERIAL_PORT. Please update your configuration."
|
#define MYSERIAL2 USBSerial
|
||||||
#elif SERIAL_PORT_2 == -1
|
#elif WITHIN(SERIAL_PORT_2, 0, 3)
|
||||||
#define MYSERIAL1 UsbSerial
|
#define MYSERIAL2 MSERIAL(SERIAL_PORT_2)
|
||||||
#elif SERIAL_PORT_2 == 0
|
|
||||||
#define MYSERIAL1 MSerial
|
|
||||||
#elif SERIAL_PORT_2 == 1
|
|
||||||
#define MYSERIAL1 MSerial1
|
|
||||||
#elif SERIAL_PORT_2 == 2
|
|
||||||
#define MYSERIAL1 MSerial2
|
|
||||||
#elif SERIAL_PORT_2 == 3
|
|
||||||
#define MYSERIAL1 MSerial3
|
|
||||||
#else
|
#else
|
||||||
#error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration."
|
#error "SERIAL_PORT_2 must be from 0 to 3. You can also use -1 if the board supports Native USB."
|
||||||
#endif
|
#endif
|
||||||
#define NUM_SERIAL 2
|
|
||||||
#else
|
|
||||||
#define NUM_SERIAL 1
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DGUS_SERIAL_PORT
|
#ifdef SERIAL_PORT_3
|
||||||
#if DGUS_SERIAL_PORT == SERIAL_PORT
|
#if SERIAL_PORT_3 == -1
|
||||||
#error "DGUS_SERIAL_PORT must be different than SERIAL_PORT. Please update your configuration."
|
#define MYSERIAL3 USBSerial
|
||||||
#elif defined(SERIAL_PORT_2) && DGUS_SERIAL_PORT == SERIAL_PORT_2
|
#elif WITHIN(SERIAL_PORT_3, 0, 3)
|
||||||
#error "DGUS_SERIAL_PORT must be different than SERIAL_PORT_2. Please update your configuration."
|
#define MYSERIAL3 MSERIAL(SERIAL_PORT_3)
|
||||||
#elif DGUS_SERIAL_PORT == -1
|
|
||||||
#define DGUS_SERIAL UsbSerial
|
|
||||||
#elif DGUS_SERIAL_PORT == 0
|
|
||||||
#define DGUS_SERIAL MSerial
|
|
||||||
#elif DGUS_SERIAL_PORT == 1
|
|
||||||
#define DGUS_SERIAL MSerial1
|
|
||||||
#elif DGUS_SERIAL_PORT == 2
|
|
||||||
#define DGUS_SERIAL MSerial2
|
|
||||||
#elif DGUS_SERIAL_PORT == 3
|
|
||||||
#define DGUS_SERIAL MSerial3
|
|
||||||
#else
|
#else
|
||||||
#error "DGUS_SERIAL_PORT must be from -1 to 3. Please update your configuration."
|
#error "SERIAL_PORT_3 must be from 0 to 3. You can also use -1 if the board supports Native USB."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MMU2_SERIAL_PORT
|
||||||
|
#if MMU2_SERIAL_PORT == -1
|
||||||
|
#define MMU2_SERIAL USBSerial
|
||||||
|
#elif WITHIN(MMU2_SERIAL_PORT, 0, 3)
|
||||||
|
#define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT)
|
||||||
|
#else
|
||||||
|
#error "MMU2_SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef LCD_SERIAL_PORT
|
||||||
|
#if LCD_SERIAL_PORT == -1
|
||||||
|
#define LCD_SERIAL USBSerial
|
||||||
|
#elif WITHIN(LCD_SERIAL_PORT, 0, 3)
|
||||||
|
#define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT)
|
||||||
|
#else
|
||||||
|
#error "LCD_SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB."
|
||||||
|
#endif
|
||||||
|
#if HAS_DGUS_LCD
|
||||||
|
#define SERIAL_GET_TX_BUFFER_FREE() MSerial0.available()
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -130,10 +129,16 @@ extern "C" volatile uint32_t _millis;
|
|||||||
//
|
//
|
||||||
// Utility functions
|
// Utility functions
|
||||||
//
|
//
|
||||||
#pragma GCC diagnostic push
|
#if GCC_VERSION <= 50000
|
||||||
#pragma GCC diagnostic ignored "-Wunused-function"
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wunused-function"
|
||||||
|
#endif
|
||||||
|
|
||||||
int freeMemory();
|
int freeMemory();
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
|
#if GCC_VERSION <= 50000
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
// ADC API
|
// ADC API
|
||||||
@@ -223,7 +228,4 @@ void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size=255,
|
|||||||
void HAL_clear_reset_source(void);
|
void HAL_clear_reset_source(void);
|
||||||
uint8_t HAL_get_reset_source(void);
|
uint8_t HAL_get_reset_source(void);
|
||||||
|
|
||||||
// Add strcmp_P if missing
|
void HAL_reboot();
|
||||||
#ifndef strcmp_P
|
|
||||||
#define strcmp_P(a, b) strcmp((a), (b))
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -0,0 +1,51 @@
|
|||||||
|
/**
|
||||||
|
* Marlin 3D Printer Firmware
|
||||||
|
* Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifdef TARGET_LPC1768
|
||||||
|
|
||||||
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
#include "HAL.h"
|
||||||
|
|
||||||
|
#if ENABLED(POSTMORTEM_DEBUGGING)
|
||||||
|
|
||||||
|
#include "../shared/HAL_MinSerial.h"
|
||||||
|
#include <debug_frmwrk.h>
|
||||||
|
|
||||||
|
static void TX(char c) { _DBC(c); }
|
||||||
|
void install_min_serial() { HAL_min_serial_out = &TX; }
|
||||||
|
|
||||||
|
#if DISABLED(DYNAMIC_VECTORTABLE)
|
||||||
|
extern "C" {
|
||||||
|
__attribute__((naked)) void JumpHandler_ASM() {
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"b CommonHandler_ASM\n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
void __attribute__((naked, alias("JumpHandler_ASM"))) HardFault_Handler();
|
||||||
|
void __attribute__((naked, alias("JumpHandler_ASM"))) BusFault_Handler();
|
||||||
|
void __attribute__((naked, alias("JumpHandler_ASM"))) UsageFault_Handler();
|
||||||
|
void __attribute__((naked, alias("JumpHandler_ASM"))) MemManage_Handler();
|
||||||
|
void __attribute__((naked, alias("JumpHandler_ASM"))) NMI_Handler();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // POSTMORTEM_DEBUGGING
|
||||||
|
#endif // TARGET_LPC1768
|
||||||
+276
-104
@@ -30,7 +30,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hardware SPI and a software SPI implementations are included in this file.
|
* Hardware SPI and Software SPI implementations are included in this file.
|
||||||
* The hardware SPI runs faster and has higher throughput but is not compatible
|
* The hardware SPI runs faster and has higher throughput but is not compatible
|
||||||
* with some LCD interfaces/adapters.
|
* with some LCD interfaces/adapters.
|
||||||
*
|
*
|
||||||
@@ -39,10 +39,10 @@
|
|||||||
* Some of the LCD interfaces/adapters result in the LCD SPI and the SD card
|
* Some of the LCD interfaces/adapters result in the LCD SPI and the SD card
|
||||||
* SPI sharing pins. The SCK, MOSI & MISO pins can NOT be set/cleared with
|
* SPI sharing pins. The SCK, MOSI & MISO pins can NOT be set/cleared with
|
||||||
* WRITE nor digitalWrite when the hardware SPI module within the LPC17xx is
|
* WRITE nor digitalWrite when the hardware SPI module within the LPC17xx is
|
||||||
* active. If any of these pins are shared then the software SPI must be used.
|
* active. If any of these pins are shared then the software SPI must be used.
|
||||||
*
|
*
|
||||||
* A more sophisticated hardware SPI can be found at the following link. This
|
* A more sophisticated hardware SPI can be found at the following link.
|
||||||
* implementation has not been fully debugged.
|
* This implementation has not been fully debugged.
|
||||||
* https://github.com/MarlinFirmware/Marlin/tree/071c7a78f27078fd4aee9a3ef365fcf5e143531e
|
* https://github.com/MarlinFirmware/Marlin/tree/071c7a78f27078fd4aee9a3ef365fcf5e143531e
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -51,27 +51,37 @@
|
|||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
#include <SPI.h>
|
#include <SPI.h>
|
||||||
|
|
||||||
|
// Hardware SPI and SPIClass
|
||||||
|
#include <lpc17xx_pinsel.h>
|
||||||
|
#include <lpc17xx_clkpwr.h>
|
||||||
|
|
||||||
|
#include "../shared/HAL_SPI.h"
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Public functions
|
// Public functions
|
||||||
// ------------------------
|
// ------------------------
|
||||||
#if ENABLED(LPC_SOFTWARE_SPI)
|
#if ENABLED(LPC_SOFTWARE_SPI)
|
||||||
|
|
||||||
#include <SoftwareSPI.h>
|
|
||||||
|
|
||||||
// Software SPI
|
// Software SPI
|
||||||
|
|
||||||
static uint8_t SPI_speed = 0;
|
#include <SoftwareSPI.h>
|
||||||
|
|
||||||
|
#ifndef HAL_SPI_SPEED
|
||||||
|
#define HAL_SPI_SPEED SPI_FULL_SPEED
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static uint8_t SPI_speed = HAL_SPI_SPEED;
|
||||||
|
|
||||||
static uint8_t spiTransfer(uint8_t b) {
|
static uint8_t spiTransfer(uint8_t b) {
|
||||||
return swSpiTransfer(b, SPI_speed, SCK_PIN, MISO_PIN, MOSI_PIN);
|
return swSpiTransfer(b, SPI_speed, SD_SCK_PIN, SD_MISO_PIN, SD_MOSI_PIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiBegin() {
|
void spiBegin() {
|
||||||
swSpiBegin(SCK_PIN, MISO_PIN, MOSI_PIN);
|
swSpiBegin(SD_SCK_PIN, SD_MISO_PIN, SD_MOSI_PIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiInit(uint8_t spiRate) {
|
void spiInit(uint8_t spiRate) {
|
||||||
SPI_speed = swSpiInit(spiRate, SCK_PIN, MOSI_PIN);
|
SPI_speed = swSpiInit(spiRate, SD_SCK_PIN, SD_MOSI_PIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t spiRec() { return spiTransfer(0xFF); }
|
uint8_t spiRec() { return spiTransfer(0xFF); }
|
||||||
@@ -83,12 +93,12 @@
|
|||||||
|
|
||||||
void spiSend(uint8_t b) { (void)spiTransfer(b); }
|
void spiSend(uint8_t b) { (void)spiTransfer(b); }
|
||||||
|
|
||||||
void spiSend(const uint8_t* buf, size_t nbyte) {
|
void spiSend(const uint8_t *buf, size_t nbyte) {
|
||||||
for (uint16_t i = 0; i < nbyte; i++)
|
for (uint16_t i = 0; i < nbyte; i++)
|
||||||
(void)spiTransfer(buf[i]);
|
(void)spiTransfer(buf[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiSendBlock(uint8_t token, const uint8_t* buf) {
|
void spiSendBlock(uint8_t token, const uint8_t *buf) {
|
||||||
(void)spiTransfer(token);
|
(void)spiTransfer(token);
|
||||||
for (uint16_t i = 0; i < 512; i++)
|
for (uint16_t i = 0; i < 512; i++)
|
||||||
(void)spiTransfer(buf[i]);
|
(void)spiTransfer(buf[i]);
|
||||||
@@ -96,91 +106,42 @@
|
|||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
// Hardware SPI
|
#ifndef HAL_SPI_SPEED
|
||||||
|
#ifdef SD_SPI_SPEED
|
||||||
#include <lpc17xx_pinsel.h>
|
#define HAL_SPI_SPEED SD_SPI_SPEED
|
||||||
#include <lpc17xx_ssp.h>
|
|
||||||
#include <lpc17xx_clkpwr.h>
|
|
||||||
|
|
||||||
// decide which HW SPI device to use
|
|
||||||
#ifndef LPC_HW_SPI_DEV
|
|
||||||
#if (SCK_PIN == P0_07 && MISO_PIN == P0_08 && MOSI_PIN == P0_09)
|
|
||||||
#define LPC_HW_SPI_DEV 1
|
|
||||||
#else
|
#else
|
||||||
#if (SCK_PIN == P0_15 && MISO_PIN == P0_17 && MOSI_PIN == P0_18)
|
#define HAL_SPI_SPEED SPI_FULL_SPEED
|
||||||
#define LPC_HW_SPI_DEV 0
|
|
||||||
#else
|
|
||||||
#error "Invalid pins selected for hardware SPI"
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if (LPC_HW_SPI_DEV == 0)
|
|
||||||
#define LPC_SSPn LPC_SSP0
|
|
||||||
#else
|
|
||||||
#define LPC_SSPn LPC_SSP1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void spiBegin() { // setup SCK, MOSI & MISO pins for SSP0
|
void spiBegin() { spiInit(HAL_SPI_SPEED); } // Set up SCK, MOSI & MISO pins for SSP0
|
||||||
PINSEL_CFG_Type PinCfg; // data structure to hold init values
|
|
||||||
PinCfg.Funcnum = 2;
|
|
||||||
PinCfg.OpenDrain = 0;
|
|
||||||
PinCfg.Pinmode = 0;
|
|
||||||
PinCfg.Pinnum = LPC176x::pin_bit(SCK_PIN);
|
|
||||||
PinCfg.Portnum = LPC176x::pin_port(SCK_PIN);
|
|
||||||
PINSEL_ConfigPin(&PinCfg);
|
|
||||||
SET_OUTPUT(SCK_PIN);
|
|
||||||
|
|
||||||
PinCfg.Pinnum = LPC176x::pin_bit(MISO_PIN);
|
|
||||||
PinCfg.Portnum = LPC176x::pin_port(MISO_PIN);
|
|
||||||
PINSEL_ConfigPin(&PinCfg);
|
|
||||||
SET_INPUT(MISO_PIN);
|
|
||||||
|
|
||||||
PinCfg.Pinnum = LPC176x::pin_bit(MOSI_PIN);
|
|
||||||
PinCfg.Portnum = LPC176x::pin_port(MOSI_PIN);
|
|
||||||
PINSEL_ConfigPin(&PinCfg);
|
|
||||||
SET_OUTPUT(MOSI_PIN);
|
|
||||||
// divide PCLK by 2 for SSP0
|
|
||||||
CLKPWR_SetPCLKDiv(LPC_HW_SPI_DEV == 0 ? CLKPWR_PCLKSEL_SSP0 : CLKPWR_PCLKSEL_SSP1, CLKPWR_PCLKSEL_CCLK_DIV_2);
|
|
||||||
spiInit(0);
|
|
||||||
SSP_Cmd(LPC_SSPn, ENABLE); // start SSP running
|
|
||||||
}
|
|
||||||
|
|
||||||
void spiInit(uint8_t spiRate) {
|
void spiInit(uint8_t spiRate) {
|
||||||
// table to convert Marlin spiRates (0-5 plus default) into bit rates
|
#if SD_MISO_PIN == BOARD_SPI1_MISO_PIN
|
||||||
uint32_t Marlin_speed[7]; // CPSR is always 2
|
SPI.setModule(1);
|
||||||
Marlin_speed[0] = 8333333; //(SCR: 2) desired: 8,000,000 actual: 8,333,333 +4.2% SPI_FULL_SPEED
|
#elif SD_MISO_PIN == BOARD_SPI2_MISO_PIN
|
||||||
Marlin_speed[1] = 4166667; //(SCR: 5) desired: 4,000,000 actual: 4,166,667 +4.2% SPI_HALF_SPEED
|
SPI.setModule(2);
|
||||||
Marlin_speed[2] = 2083333; //(SCR: 11) desired: 2,000,000 actual: 2,083,333 +4.2% SPI_QUARTER_SPEED
|
#endif
|
||||||
Marlin_speed[3] = 1000000; //(SCR: 24) desired: 1,000,000 actual: 1,000,000 SPI_EIGHTH_SPEED
|
SPI.setDataSize(DATA_SIZE_8BIT);
|
||||||
Marlin_speed[4] = 500000; //(SCR: 49) desired: 500,000 actual: 500,000 SPI_SPEED_5
|
SPI.setDataMode(SPI_MODE0);
|
||||||
Marlin_speed[5] = 250000; //(SCR: 99) desired: 250,000 actual: 250,000 SPI_SPEED_6
|
|
||||||
Marlin_speed[6] = 125000; //(SCR:199) desired: 125,000 actual: 125,000 Default from HAL.h
|
SPI.setClock(SPISettings::spiRate2Clock(spiRate));
|
||||||
// setup for SPI mode
|
SPI.begin();
|
||||||
SSP_CFG_Type HW_SPI_init; // data structure to hold init values
|
|
||||||
SSP_ConfigStructInit(&HW_SPI_init); // set values for SPI mode
|
|
||||||
HW_SPI_init.ClockRate = Marlin_speed[_MIN(spiRate, 6)]; // put in the specified bit rate
|
|
||||||
HW_SPI_init.Mode |= SSP_CR1_SSP_EN;
|
|
||||||
SSP_Init(LPC_SSPn, &HW_SPI_init); // puts the values into the proper bits in the SSP0 registers
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t doio(uint8_t b) {
|
static uint8_t doio(uint8_t b) {
|
||||||
/* send and receive a single byte */
|
return SPI.transfer(b & 0x00FF) & 0x00FF;
|
||||||
SSP_SendData(LPC_SSPn, b & 0x00FF);
|
|
||||||
while (SSP_GetStatus(LPC_SSPn, SSP_STAT_BUSY)); // wait for it to finish
|
|
||||||
return SSP_ReceiveData(LPC_SSPn) & 0x00FF;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiSend(uint8_t b) { doio(b); }
|
void spiSend(uint8_t b) { doio(b); }
|
||||||
|
|
||||||
void spiSend(const uint8_t* buf, size_t nbyte) {
|
void spiSend(const uint8_t *buf, size_t nbyte) {
|
||||||
for (uint16_t i = 0; i < nbyte; i++) doio(buf[i]);
|
for (uint16_t i = 0; i < nbyte; i++) doio(buf[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiSend(uint32_t chan, byte b) {
|
void spiSend(uint32_t chan, byte b) {}
|
||||||
}
|
|
||||||
|
|
||||||
void spiSend(uint32_t chan, const uint8_t* buf, size_t nbyte) {
|
void spiSend(uint32_t chan, const uint8_t *buf, size_t nbyte) {}
|
||||||
}
|
|
||||||
|
|
||||||
// Read single byte from SPI
|
// Read single byte from SPI
|
||||||
uint8_t spiRec() { return doio(0xFF); }
|
uint8_t spiRec() { return doio(0xFF); }
|
||||||
@@ -192,49 +153,260 @@
|
|||||||
for (uint16_t i = 0; i < nbyte; i++) buf[i] = doio(0xFF);
|
for (uint16_t i = 0; i < nbyte; i++) buf[i] = doio(0xFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t spiTransfer(uint8_t b) {
|
uint8_t spiTransfer(uint8_t b) { return doio(b); }
|
||||||
return doio(b);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write from buffer to SPI
|
// Write from buffer to SPI
|
||||||
void spiSendBlock(uint8_t token, const uint8_t* buf) {
|
void spiSendBlock(uint8_t token, const uint8_t *buf) {
|
||||||
(void)spiTransfer(token);
|
(void)spiTransfer(token);
|
||||||
for (uint16_t i = 0; i < 512; i++)
|
for (uint16_t i = 0; i < 512; i++)
|
||||||
(void)spiTransfer(buf[i]);
|
(void)spiTransfer(buf[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Begin SPI transaction, set clock, bit order, data mode */
|
// Begin SPI transaction, set clock, bit order, data mode
|
||||||
void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) {
|
void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) {
|
||||||
// TODO: to be implemented
|
// TODO: Implement this method
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // LPC_SOFTWARE_SPI
|
#endif // LPC_SOFTWARE_SPI
|
||||||
|
|
||||||
void SPIClass::begin() { spiBegin(); }
|
/**
|
||||||
|
* @brief Wait until TXE (tx empty) flag is set and BSY (busy) flag unset.
|
||||||
|
*/
|
||||||
|
static inline void waitSpiTxEnd(LPC_SSP_TypeDef *spi_d) {
|
||||||
|
while (SSP_GetStatus(spi_d, SSP_STAT_TXFIFO_EMPTY) == RESET) { /* nada */ } // wait until TXE=1
|
||||||
|
while (SSP_GetStatus(spi_d, SSP_STAT_BUSY) == SET) { /* nada */ } // wait until BSY=0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retain the pin init state of the SPI, to avoid init more than once,
|
||||||
|
// even if more instances of SPIClass exist
|
||||||
|
static bool spiInitialised[BOARD_NR_SPI] = { false };
|
||||||
|
|
||||||
|
SPIClass::SPIClass(uint8_t device) {
|
||||||
|
// Init things specific to each SPI device
|
||||||
|
// clock divider setup is a bit of hack, and needs to be improved at a later date.
|
||||||
|
|
||||||
|
#if BOARD_NR_SPI >= 1
|
||||||
|
_settings[0].spi_d = LPC_SSP0;
|
||||||
|
_settings[0].dataMode = SPI_MODE0;
|
||||||
|
_settings[0].dataSize = DATA_SIZE_8BIT;
|
||||||
|
_settings[0].clock = SPI_CLOCK_MAX;
|
||||||
|
//_settings[0].clockDivider = determine_baud_rate(_settings[0].spi_d, _settings[0].clock);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if BOARD_NR_SPI >= 2
|
||||||
|
_settings[1].spi_d = LPC_SSP1;
|
||||||
|
_settings[1].dataMode = SPI_MODE0;
|
||||||
|
_settings[1].dataSize = DATA_SIZE_8BIT;
|
||||||
|
_settings[1].clock = SPI_CLOCK_MAX;
|
||||||
|
//_settings[1].clockDivider = determine_baud_rate(_settings[1].spi_d, _settings[1].clock);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
setModule(device);
|
||||||
|
|
||||||
|
// Init the GPDMA controller
|
||||||
|
// TODO: call once in the constructor? or each time?
|
||||||
|
GPDMA_Init();
|
||||||
|
}
|
||||||
|
|
||||||
|
SPIClass::SPIClass(pin_t mosi, pin_t miso, pin_t sclk, pin_t ssel) {
|
||||||
|
#if BOARD_NR_SPI >= 1
|
||||||
|
if (mosi == BOARD_SPI1_MOSI_PIN) SPIClass(1);
|
||||||
|
#endif
|
||||||
|
#if BOARD_NR_SPI >= 2
|
||||||
|
if (mosi == BOARD_SPI2_MOSI_PIN) SPIClass(2);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void SPIClass::begin() {
|
||||||
|
// Init the SPI pins in the first begin call
|
||||||
|
if ((_currentSetting->spi_d == LPC_SSP0 && spiInitialised[0] == false) ||
|
||||||
|
(_currentSetting->spi_d == LPC_SSP1 && spiInitialised[1] == false)) {
|
||||||
|
pin_t sck, miso, mosi;
|
||||||
|
if (_currentSetting->spi_d == LPC_SSP0) {
|
||||||
|
sck = BOARD_SPI1_SCK_PIN;
|
||||||
|
miso = BOARD_SPI1_MISO_PIN;
|
||||||
|
mosi = BOARD_SPI1_MOSI_PIN;
|
||||||
|
spiInitialised[0] = true;
|
||||||
|
}
|
||||||
|
else if (_currentSetting->spi_d == LPC_SSP1) {
|
||||||
|
sck = BOARD_SPI2_SCK_PIN;
|
||||||
|
miso = BOARD_SPI2_MISO_PIN;
|
||||||
|
mosi = BOARD_SPI2_MOSI_PIN;
|
||||||
|
spiInitialised[1] = true;
|
||||||
|
}
|
||||||
|
PINSEL_CFG_Type PinCfg; // data structure to hold init values
|
||||||
|
PinCfg.Funcnum = 2;
|
||||||
|
PinCfg.OpenDrain = 0;
|
||||||
|
PinCfg.Pinmode = 0;
|
||||||
|
PinCfg.Pinnum = LPC176x::pin_bit(sck);
|
||||||
|
PinCfg.Portnum = LPC176x::pin_port(sck);
|
||||||
|
PINSEL_ConfigPin(&PinCfg);
|
||||||
|
SET_OUTPUT(sck);
|
||||||
|
|
||||||
|
PinCfg.Pinnum = LPC176x::pin_bit(miso);
|
||||||
|
PinCfg.Portnum = LPC176x::pin_port(miso);
|
||||||
|
PINSEL_ConfigPin(&PinCfg);
|
||||||
|
SET_INPUT(miso);
|
||||||
|
|
||||||
|
PinCfg.Pinnum = LPC176x::pin_bit(mosi);
|
||||||
|
PinCfg.Portnum = LPC176x::pin_port(mosi);
|
||||||
|
PINSEL_ConfigPin(&PinCfg);
|
||||||
|
SET_OUTPUT(mosi);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateSettings();
|
||||||
|
SSP_Cmd(_currentSetting->spi_d, ENABLE); // start SSP running
|
||||||
|
}
|
||||||
|
|
||||||
void SPIClass::beginTransaction(const SPISettings &cfg) {
|
void SPIClass::beginTransaction(const SPISettings &cfg) {
|
||||||
uint8_t spiRate;
|
setBitOrder(cfg.bitOrder);
|
||||||
switch (cfg.spiRate()) {
|
setDataMode(cfg.dataMode);
|
||||||
case 8000000: spiRate = 0; break;
|
setDataSize(cfg.dataSize);
|
||||||
case 4000000: spiRate = 1; break;
|
//setClockDivider(determine_baud_rate(_currentSetting->spi_d, settings.clock));
|
||||||
case 2000000: spiRate = 2; break;
|
begin();
|
||||||
case 1000000: spiRate = 3; break;
|
|
||||||
case 500000: spiRate = 4; break;
|
|
||||||
case 250000: spiRate = 5; break;
|
|
||||||
case 125000: spiRate = 6; break;
|
|
||||||
default: spiRate = 2; break;
|
|
||||||
}
|
|
||||||
spiInit(spiRate);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t SPIClass::transfer(const uint8_t B) { return spiTransfer(B); }
|
uint8_t SPIClass::transfer(const uint16_t b) {
|
||||||
|
// Send and receive a single byte
|
||||||
|
SSP_ReceiveData(_currentSetting->spi_d); // read any previous data
|
||||||
|
SSP_SendData(_currentSetting->spi_d, b);
|
||||||
|
waitSpiTxEnd(_currentSetting->spi_d); // wait for it to finish
|
||||||
|
return SSP_ReceiveData(_currentSetting->spi_d);
|
||||||
|
}
|
||||||
|
|
||||||
uint16_t SPIClass::transfer16(const uint16_t data) {
|
uint16_t SPIClass::transfer16(const uint16_t data) {
|
||||||
return (transfer((data >> 8) & 0xFF) << 8)
|
return (transfer((data >> 8) & 0xFF) << 8) | (transfer(data & 0xFF) & 0xFF);
|
||||||
| (transfer(data & 0xFF) & 0xFF);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SPIClass SPI;
|
void SPIClass::end() {
|
||||||
|
// Neither is needed for Marlin
|
||||||
|
//SSP_Cmd(_currentSetting->spi_d, DISABLE);
|
||||||
|
//SSP_DeInit(_currentSetting->spi_d);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SPIClass::send(uint8_t data) {
|
||||||
|
SSP_SendData(_currentSetting->spi_d, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SPIClass::dmaSend(void *buf, uint16_t length, bool minc) {
|
||||||
|
//TODO: LPC dma can only write 0xFFF bytes at once.
|
||||||
|
GPDMA_Channel_CFG_Type GPDMACfg;
|
||||||
|
|
||||||
|
/* Configure GPDMA channel 0 -------------------------------------------------------------*/
|
||||||
|
/* DMA Channel 0 */
|
||||||
|
GPDMACfg.ChannelNum = 0;
|
||||||
|
// Source memory
|
||||||
|
GPDMACfg.SrcMemAddr = (uint32_t)buf;
|
||||||
|
// Destination memory - Not used
|
||||||
|
GPDMACfg.DstMemAddr = 0;
|
||||||
|
// Transfer size
|
||||||
|
GPDMACfg.TransferSize = length;
|
||||||
|
// Transfer width
|
||||||
|
GPDMACfg.TransferWidth = (_currentSetting->dataSize == DATA_SIZE_16BIT) ? GPDMA_WIDTH_HALFWORD : GPDMA_WIDTH_BYTE;
|
||||||
|
// Transfer type
|
||||||
|
GPDMACfg.TransferType = GPDMA_TRANSFERTYPE_M2P;
|
||||||
|
// Source connection - unused
|
||||||
|
GPDMACfg.SrcConn = 0;
|
||||||
|
// Destination connection
|
||||||
|
GPDMACfg.DstConn = (_currentSetting->spi_d == LPC_SSP0) ? GPDMA_CONN_SSP0_Tx : GPDMA_CONN_SSP1_Tx;
|
||||||
|
|
||||||
|
GPDMACfg.DMALLI = 0;
|
||||||
|
|
||||||
|
// Enable dma on SPI
|
||||||
|
SSP_DMACmd(_currentSetting->spi_d, SSP_DMA_TX, ENABLE);
|
||||||
|
|
||||||
|
// Only increase memory if minc is true
|
||||||
|
GPDMACfg.MemoryIncrease = (minc ? GPDMA_DMACCxControl_SI : 0);
|
||||||
|
|
||||||
|
// Setup channel with given parameter
|
||||||
|
GPDMA_Setup(&GPDMACfg);
|
||||||
|
|
||||||
|
// Enable DMA
|
||||||
|
GPDMA_ChannelCmd(0, ENABLE);
|
||||||
|
|
||||||
|
// Wait for data transfer
|
||||||
|
while (!GPDMA_IntGetStatus(GPDMA_STAT_RAWINTTC, 0) && !GPDMA_IntGetStatus(GPDMA_STAT_RAWINTERR, 0)) { }
|
||||||
|
|
||||||
|
// Clear err and int
|
||||||
|
GPDMA_ClearIntPending (GPDMA_STATCLR_INTTC, 0);
|
||||||
|
GPDMA_ClearIntPending (GPDMA_STATCLR_INTERR, 0);
|
||||||
|
|
||||||
|
// Disable DMA
|
||||||
|
GPDMA_ChannelCmd(0, DISABLE);
|
||||||
|
|
||||||
|
waitSpiTxEnd(_currentSetting->spi_d);
|
||||||
|
|
||||||
|
SSP_DMACmd(_currentSetting->spi_d, SSP_DMA_TX, DISABLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t SPIClass::read() {
|
||||||
|
return SSP_ReceiveData(_currentSetting->spi_d);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SPIClass::read(uint8_t *buf, uint32_t len) {
|
||||||
|
for (uint16_t i = 0; i < len; i++) buf[i] = transfer(0xFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SPIClass::setClock(uint32_t clock) { _currentSetting->clock = clock; }
|
||||||
|
|
||||||
|
void SPIClass::setModule(uint8_t device) { _currentSetting = &_settings[device - 1]; } // SPI channels are called 1, 2, and 3 but the array is zero-indexed
|
||||||
|
|
||||||
|
void SPIClass::setBitOrder(uint8_t bitOrder) { _currentSetting->bitOrder = bitOrder; }
|
||||||
|
|
||||||
|
void SPIClass::setDataMode(uint8_t dataMode) { _currentSetting->dataMode = dataMode; }
|
||||||
|
|
||||||
|
void SPIClass::setDataSize(uint32_t dataSize) { _currentSetting->dataSize = dataSize; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set up/tear down
|
||||||
|
*/
|
||||||
|
void SPIClass::updateSettings() {
|
||||||
|
//SSP_DeInit(_currentSetting->spi_d); //todo: need force de init?!
|
||||||
|
|
||||||
|
// Divide PCLK by 2 for SSP0
|
||||||
|
//CLKPWR_SetPCLKDiv(_currentSetting->spi_d == LPC_SSP0 ? CLKPWR_PCLKSEL_SSP0 : CLKPWR_PCLKSEL_SSP1, CLKPWR_PCLKSEL_CCLK_DIV_2);
|
||||||
|
|
||||||
|
SSP_CFG_Type HW_SPI_init; // data structure to hold init values
|
||||||
|
SSP_ConfigStructInit(&HW_SPI_init); // set values for SPI mode
|
||||||
|
HW_SPI_init.ClockRate = _currentSetting->clock;
|
||||||
|
HW_SPI_init.Databit = _currentSetting->dataSize;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SPI Mode CPOL CPHA Shift SCK-edge Capture SCK-edge
|
||||||
|
* 0 0 0 Falling Rising
|
||||||
|
* 1 0 1 Rising Falling
|
||||||
|
* 2 1 0 Rising Falling
|
||||||
|
* 3 1 1 Falling Rising
|
||||||
|
*/
|
||||||
|
switch (_currentSetting->dataMode) {
|
||||||
|
case SPI_MODE0:
|
||||||
|
HW_SPI_init.CPHA = SSP_CPHA_FIRST;
|
||||||
|
HW_SPI_init.CPOL = SSP_CPOL_HI;
|
||||||
|
break;
|
||||||
|
case SPI_MODE1:
|
||||||
|
HW_SPI_init.CPHA = SSP_CPHA_SECOND;
|
||||||
|
HW_SPI_init.CPOL = SSP_CPOL_HI;
|
||||||
|
break;
|
||||||
|
case SPI_MODE2:
|
||||||
|
HW_SPI_init.CPHA = SSP_CPHA_FIRST;
|
||||||
|
HW_SPI_init.CPOL = SSP_CPOL_LO;
|
||||||
|
break;
|
||||||
|
case SPI_MODE3:
|
||||||
|
HW_SPI_init.CPHA = SSP_CPHA_SECOND;
|
||||||
|
HW_SPI_init.CPOL = SSP_CPOL_LO;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: handle bitOrder
|
||||||
|
SSP_Init(_currentSetting->spi_d, &HW_SPI_init); // puts the values into the proper bits in the SSP0 registers
|
||||||
|
}
|
||||||
|
|
||||||
|
#if SD_MISO_PIN == BOARD_SPI1_MISO_PIN
|
||||||
|
SPIClass SPI(1);
|
||||||
|
#elif SD_MISO_PIN == BOARD_SPI2_MISO_PIN
|
||||||
|
SPIClass SPI(2);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // TARGET_LPC1768
|
#endif // TARGET_LPC1768
|
||||||
|
|||||||
+20
-21
@@ -21,26 +21,25 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <SPI.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file tft_lvgl_configuration.h
|
* Marlin currently requires 3 SPI classes:
|
||||||
* @date 2020-02-21
|
*
|
||||||
* */
|
* SPIClass:
|
||||||
|
* This class is normally provided by frameworks and has a semi-default interface.
|
||||||
|
* This is needed because some libraries reference it globally.
|
||||||
|
*
|
||||||
|
* SPISettings:
|
||||||
|
* Container for SPI configs for SPIClass. As above, libraries may reference it globally.
|
||||||
|
*
|
||||||
|
* These two classes are often provided by frameworks so we cannot extend them to add
|
||||||
|
* useful methods for Marlin.
|
||||||
|
*
|
||||||
|
* MarlinSPI:
|
||||||
|
* Provides the default SPIClass interface plus some Marlin goodies such as a simplified
|
||||||
|
* interface for SPI DMA transfer.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
//#ifdef __cplusplus
|
using MarlinSPI = SPIClass;
|
||||||
//extern "C" {
|
|
||||||
//#endif
|
|
||||||
|
|
||||||
#include <lvgl.h>
|
|
||||||
|
|
||||||
void tft_lvgl_init();
|
|
||||||
void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p);
|
|
||||||
bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data);
|
|
||||||
|
|
||||||
void LCD_Clear(uint16_t Color);
|
|
||||||
void tft_set_point(uint16_t x, uint16_t y, uint16_t point);
|
|
||||||
void ili9320_SetWindows(uint16_t StartX, uint16_t StartY, uint16_t width, uint16_t heigh);
|
|
||||||
void LCD_WriteRAM_Prepare(void);
|
|
||||||
|
|
||||||
//#ifdef __cplusplus
|
|
||||||
//} /* extern "C" */
|
|
||||||
//#endif
|
|
||||||
@@ -21,35 +21,51 @@
|
|||||||
*/
|
*/
|
||||||
#ifdef TARGET_LPC1768
|
#ifdef TARGET_LPC1768
|
||||||
|
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
|
||||||
#include "MarlinSerial.h"
|
#include "MarlinSerial.h"
|
||||||
|
|
||||||
#if (defined(SERIAL_PORT) && SERIAL_PORT == 0) || (defined(SERIAL_PORT_2) && SERIAL_PORT_2 == 0) || (defined(DGUS_SERIAL_PORT) && DGUS_SERIAL_PORT == 0)
|
#include "../../inc/MarlinConfig.h"
|
||||||
MarlinSerial MSerial(LPC_UART0);
|
|
||||||
extern "C" void UART0_IRQHandler() {
|
#if USING_HW_SERIAL0
|
||||||
MSerial.IRQHandler();
|
MarlinSerial _MSerial0(LPC_UART0);
|
||||||
}
|
MSerialT MSerial0(true, _MSerial0);
|
||||||
|
extern "C" void UART0_IRQHandler() { _MSerial0.IRQHandler(); }
|
||||||
|
#endif
|
||||||
|
#if USING_HW_SERIAL1
|
||||||
|
MarlinSerial _MSerial1((LPC_UART_TypeDef *) LPC_UART1);
|
||||||
|
MSerialT MSerial1(true, _MSerial1);
|
||||||
|
extern "C" void UART1_IRQHandler() { _MSerial1.IRQHandler(); }
|
||||||
|
#endif
|
||||||
|
#if USING_HW_SERIAL2
|
||||||
|
MarlinSerial _MSerial2(LPC_UART2);
|
||||||
|
MSerialT MSerial2(true, _MSerial2);
|
||||||
|
extern "C" void UART2_IRQHandler() { _MSerial2.IRQHandler(); }
|
||||||
|
#endif
|
||||||
|
#if USING_HW_SERIAL3
|
||||||
|
MarlinSerial _MSerial3(LPC_UART3);
|
||||||
|
MSerialT MSerial3(true, _MSerial3);
|
||||||
|
extern "C" void UART3_IRQHandler() { _MSerial3.IRQHandler(); }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if SERIAL_PORT == 1 || SERIAL_PORT_2 == 1 || DGUS_SERIAL_PORT == 1
|
#if ENABLED(EMERGENCY_PARSER)
|
||||||
MarlinSerial MSerial1((LPC_UART_TypeDef *) LPC_UART1);
|
|
||||||
extern "C" void UART1_IRQHandler() {
|
|
||||||
MSerial1.IRQHandler();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if SERIAL_PORT == 2 || SERIAL_PORT_2 == 2 || DGUS_SERIAL_PORT == 2
|
bool MarlinSerial::recv_callback(const char c) {
|
||||||
MarlinSerial MSerial2(LPC_UART2);
|
// Need to figure out which serial port we are and react in consequence (Marlin does not have CONTAINER_OF macro)
|
||||||
extern "C" void UART2_IRQHandler() {
|
if (false) {}
|
||||||
MSerial2.IRQHandler();
|
#if USING_HW_SERIAL0
|
||||||
|
else if (this == &_MSerial0) emergency_parser.update(MSerial0.emergency_state, c);
|
||||||
|
#endif
|
||||||
|
#if USING_HW_SERIAL1
|
||||||
|
else if (this == &_MSerial1) emergency_parser.update(MSerial1.emergency_state, c);
|
||||||
|
#endif
|
||||||
|
#if USING_HW_SERIAL2
|
||||||
|
else if (this == &_MSerial2) emergency_parser.update(MSerial2.emergency_state, c);
|
||||||
|
#endif
|
||||||
|
#if USING_HW_SERIAL3
|
||||||
|
else if (this == &_MSerial3) emergency_parser.update(MSerial3.emergency_state, c);
|
||||||
|
#endif
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#if SERIAL_PORT == 3 || SERIAL_PORT_2 == 3 || DGUS_SERIAL_PORT == 3
|
|
||||||
MarlinSerial MSerial3(LPC_UART3);
|
|
||||||
extern "C" void UART3_IRQHandler() {
|
|
||||||
MSerial3.IRQHandler();
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // TARGET_LPC1768
|
#endif // TARGET_LPC1768
|
||||||
|
|||||||
@@ -28,6 +28,7 @@
|
|||||||
#if ENABLED(EMERGENCY_PARSER)
|
#if ENABLED(EMERGENCY_PARSER)
|
||||||
#include "../../feature/e_parser.h"
|
#include "../../feature/e_parser.h"
|
||||||
#endif
|
#endif
|
||||||
|
#include "../../core/serial_hook.h"
|
||||||
|
|
||||||
#ifndef SERIAL_PORT
|
#ifndef SERIAL_PORT
|
||||||
#define SERIAL_PORT 0
|
#define SERIAL_PORT 0
|
||||||
@@ -41,26 +42,26 @@
|
|||||||
|
|
||||||
class MarlinSerial : public HardwareSerial<RX_BUFFER_SIZE, TX_BUFFER_SIZE> {
|
class MarlinSerial : public HardwareSerial<RX_BUFFER_SIZE, TX_BUFFER_SIZE> {
|
||||||
public:
|
public:
|
||||||
MarlinSerial(LPC_UART_TypeDef *UARTx) :
|
MarlinSerial(LPC_UART_TypeDef *UARTx) : HardwareSerial<RX_BUFFER_SIZE, TX_BUFFER_SIZE>(UARTx) { }
|
||||||
HardwareSerial<RX_BUFFER_SIZE, TX_BUFFER_SIZE>(UARTx)
|
|
||||||
#if ENABLED(EMERGENCY_PARSER)
|
|
||||||
, emergency_state(EmergencyParser::State::EP_RESET)
|
|
||||||
#endif
|
|
||||||
{ }
|
|
||||||
|
|
||||||
void end() {}
|
void end() {}
|
||||||
|
|
||||||
#if ENABLED(EMERGENCY_PARSER)
|
#if ENABLED(EMERGENCY_PARSER)
|
||||||
bool recv_callback(const char c) override {
|
bool recv_callback(const char c) override;
|
||||||
emergency_parser.update(emergency_state, c);
|
|
||||||
return true; // do not discard character
|
|
||||||
}
|
|
||||||
|
|
||||||
EmergencyParser::State emergency_state;
|
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
extern MarlinSerial MSerial;
|
// On LPC176x framework, HardwareSerial does not implement the same interface as Arduino's Serial, so overloads
|
||||||
extern MarlinSerial MSerial1;
|
// of 'available' and 'read' method are not used in this multiple inheritance scenario.
|
||||||
extern MarlinSerial MSerial2;
|
// Instead, use a ForwardSerial here that adapts the interface.
|
||||||
extern MarlinSerial MSerial3;
|
typedef ForwardSerial1Class<MarlinSerial> MSerialT;
|
||||||
|
extern MSerialT MSerial0;
|
||||||
|
extern MSerialT MSerial1;
|
||||||
|
extern MSerialT MSerial2;
|
||||||
|
extern MSerialT MSerial3;
|
||||||
|
|
||||||
|
// Consequently, we can't use a RuntimeSerial either. The workaround would be to use
|
||||||
|
// a RuntimeSerial<ForwardSerial<MarlinSerial>> type here. Ignore for now until it's actually required.
|
||||||
|
#if ENABLED(SERIAL_RUNTIME_HOOK)
|
||||||
|
#error "SERIAL_RUNTIME_HOOK is not yet supported for LPC176x."
|
||||||
|
#endif
|
||||||
|
|||||||
@@ -46,7 +46,6 @@
|
|||||||
* Version 2 Copyright (c) 2009 Michael Margolis. All right reserved.
|
* Version 2 Copyright (c) 2009 Michael Margolis. All right reserved.
|
||||||
*
|
*
|
||||||
* The only modification was to update/delete macros to match the LPC176x.
|
* The only modification was to update/delete macros to match the LPC176x.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <Servo.h>
|
#include <Servo.h>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user