From ff35dc6d3fe322ee97af762c681b81043ea9764b Mon Sep 17 00:00:00 2001 From: Miguel Risco-Castillo Date: Thu, 25 Jan 2024 00:30:07 -0500 Subject: [PATCH] Added an exclusion zone in the EEPROM. That zone is used by some boot loaders to save flags that control the flashing at boot process. The exclusion zone should be defined in the **.INI** board environments that require it by: ```log -DEEPROM_EXCL_ZONE=100,200 ``` or in the board pin file by: ```c++ #define EEPROM_EXCL_ZONE 100,200 // Test a range or #define EEPROM_EXCL_ZONE 333 // Test a single byte ``` For example, in the Ender-3S1 F4: Marlin\src\pins\stm32f4\pins_CREALITY_V24S1_301F4.h: ```c++ #define EEPROM_EXCL_ZONE 919,926 // Test a range ``` ### Related Issues In the Ender-3 S1 with the STM32F401 SoC the range of exclusion is from 919 to 926. Even if the zone is filled with 0xFF values, the boot loader changes it when the printer is rebooted: ```log 0370: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0380: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0390: FF FF FF FF 00 FF FF FF FF FF FF FF FF 66 FF FF 03A0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 03B0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ``` If the zone is not excluded, the boot loader may not allow flashing new firmware and may also cause CRC EEPROM corruption. Perhaps related to: https://github.com/mriscoc/Ender3V2S1/issues/125 https://github.com/mriscoc/Ender3V2S1/issues/1180 https://github.com/MarlinFirmware/Marlin/issues/26144 --- Marlin/lib/proui/stm32f1/libproui_abl_dwin.a | Bin 90812 -> 90704 bytes .../proui/stm32f1/libproui_abl_ultipanel.a | Bin 38610 -> 38442 bytes Marlin/lib/proui/stm32f1/libproui_mbl_dwin.a | Bin 77904 -> 77904 bytes .../proui/stm32f1/libproui_mbl_ultipanel.a | Bin 30742 -> 30578 bytes Marlin/lib/proui/stm32f1/libproui_ubl_dwin.a | Bin 113036 -> 112928 bytes .../proui/stm32f1/libproui_ubl_ultipanel.a | Bin 43422 -> 43262 bytes Marlin/lib/proui/stm32f4/libproui_abl_dwin.a | Bin 88448 -> 88344 bytes Marlin/lib/proui/stm32f4/libproui_mbl_dwin.a | Bin 76796 -> 76796 bytes Marlin/lib/proui/stm32f4/libproui_ubl_dwin.a | Bin 110492 -> 110388 bytes Marlin/lib/proui/stm32g0/libproui_abl_dwin.a | Bin 90004 -> 89900 bytes Marlin/lib/proui/stm32g0/libproui_mbl_dwin.a | Bin 77486 -> 77486 bytes Marlin/lib/proui/stm32g0/libproui_ubl_dwin.a | Bin 94026 -> 93922 bytes Marlin/src/HAL/AVR/eeprom.cpp | 6 +-- Marlin/src/HAL/DUE/eeprom_flash.cpp | 6 +-- Marlin/src/HAL/DUE/eeprom_wired.cpp | 6 +-- Marlin/src/HAL/ESP32/eeprom.cpp | 10 +++-- Marlin/src/HAL/HC32/eeprom_bl24cxx.cpp | 16 +++----- Marlin/src/HAL/HC32/eeprom_sdcard.cpp | 7 +--- Marlin/src/HAL/HC32/eeprom_wired.cpp | 10 ++--- Marlin/src/HAL/LINUX/eeprom.cpp | 2 +- Marlin/src/HAL/LPC1768/eeprom_flash.cpp | 8 ++-- Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp | 2 +- Marlin/src/HAL/LPC1768/eeprom_wired.cpp | 6 +-- Marlin/src/HAL/SAMD21/eeprom_flash.cpp | 38 ++++++++++-------- Marlin/src/HAL/SAMD21/eeprom_qspi.cpp | 6 +-- Marlin/src/HAL/SAMD21/eeprom_wired.cpp | 6 +-- Marlin/src/HAL/SAMD51/eeprom_qspi.cpp | 6 +-- Marlin/src/HAL/SAMD51/eeprom_wired.cpp | 6 +-- Marlin/src/HAL/STM32/eeprom_bl24cxx.cpp | 7 ++-- Marlin/src/HAL/STM32/eeprom_flash.cpp | 14 ++++--- Marlin/src/HAL/STM32/eeprom_sdcard.cpp | 2 +- Marlin/src/HAL/STM32/eeprom_sram.cpp | 2 +- Marlin/src/HAL/STM32/eeprom_wired.cpp | 6 +-- Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp | 7 ++-- Marlin/src/HAL/STM32F1/eeprom_flash.cpp | 2 +- Marlin/src/HAL/STM32F1/eeprom_sdcard.cpp | 2 +- Marlin/src/HAL/STM32F1/eeprom_wired.cpp | 6 +-- Marlin/src/HAL/TEENSY31_32/eeprom.cpp | 6 +-- Marlin/src/HAL/TEENSY35_36/eeprom.cpp | 6 +-- Marlin/src/HAL/TEENSY40_41/eeprom.cpp | 6 +-- Marlin/src/HAL/shared/eeprom_api.h | 13 ++++++ Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 3 +- Marlin/src/module/settings.cpp | 8 ++-- .../pins/stm32f4/pins_CREALITY_V24S1_301F4.h | 2 + 44 files changed, 123 insertions(+), 110 deletions(-) diff --git a/Marlin/lib/proui/stm32f1/libproui_abl_dwin.a b/Marlin/lib/proui/stm32f1/libproui_abl_dwin.a index 954d704c7a50dbd7e1206757a832f8c6b5b7a1be..1d401fb3232eeedf69085d99212c58059ab82a8e 100644 GIT binary patch delta 1609 zcmb`Hdq`AS9LK-sI#=D%Y;>kcO~*TGBTZSEV_VT5N-;KRF%gzTQGpx&k-L^|q_9m` z>~7(Zd8%VzU?DxAmke2fWkmf|LA&@*5cK$?2lN<=cBiL%e%GUvf975|_jA6V^SJl? zF5JGG`rR9P+mwX4Ma9Lw;*y@+g<44O02@y;=7Ei)g~qe^e^~q7Zyz}jx67$2>5I5B zw}eLmcV(tW&YlRTd?lQb>fWTRZ^X{Oca3}rpIqY9O6K#kC%jsBDqsF;@8W|Mh0mkq zJT|M;*K_4rw4CL_y?@EjzhC;@e#0+0^dPpqMYdxPVx{frF_r{3qD(JOq_KFv?{d)3 zJ+D1KKKu*rM03H8p5{QSLBmafE|auz>6@aoRqiUv{jEkrps|u>H1K_|n-W%4O!a5f zR`H3^$t=hVqWu}}iWb8iSQ+yKY1SblCqT@p$l*iLZ06M6E>{VCsaD?d^{ zn5D7mNce4@#=3dWyFXUgHH=<1*_$^eSB=T*#^hhe!Xvd{wg6zgwY^Nh}0vh%m$r%9^Yxo!qMEB4zS=uDiCdWzJB(meA-7Rgh zY1fi%6Ln;djM~#=Pl+pJ&q*6^&izF8f|y{D_NKHB(^gufy(iX@{UEK)w4G$F;tW}r zJnQh>7i8y%&tw-#JG}2gUD|+Hrn3U=yoJ9y?$IC0!Fq92XL)*1R;WYlH<-P>*T!ax Xmpb!~{Hrdy;@RQM(R9^dU&{UiDMCIr delta 1726 zcmb`HU2Kz87{~wTUE384OFu@}b!EP7p_4D^q)bPQX>}1pWH8n#W&KaiF zR%RkDT~a+8$C$+oL!1|cFsj1H$ka$;0x{r)@y1NN0xrgiL0^=J=V=ZL^wRkzZ-3|c zo#%PaXL{i~^YmGBv8gt)sl9Dud;4VIQ7vaNfi33MkAN-W%`K+*f2e)rzs|liQZwkj zvy-J}@4n$X0dMwtO2;OK>+TZnQrA~D-#sG#`tDV8%nLe zVr=_3$&C%s$mE&J#x@p!Up#sH&wpn8aXl`1d)62^Fl%&uI%^b9NPg%sm<@i+GxHWJ z^;_awr<}pA_>h4x_gxD;@ykW{t(DSalW!#oIwfTj;}u4)w>qEJclpV&!2V>N?(L;v zWjs^R`xE_Jsi&V0TpPH5cXCy{F|#}A$&iEJQu(HJ%2Gx=9N*3z^D~XX5dr)Iv^U)jcpW}uXLyT`Vt)( z{t-zXn4IW+Yk?GT9k7eI9(bAfAn*op4e%~e z2MUTG5jOxQRD4?TTVgBl12F*ntoWPaRmJPXAab}xjg^2!u7YS+^eTpk4*~0l8-dNr zKTcc)bP_|r^D6Eowg6cb7Zk^cGVgO0Pgj@&&Z~}}RL50CLwQYZGY#Y+>VU2oA^L!* z;tR_6N@@|{HKH5XPn7q8j#Fy_^2AMYM~OKHaF80ca%+iRph#>3=)ARufidC|V4T

1x4hi&vPmSWF} z1Y>LEZH{r5ILMgYl9lDq#3zge*k17sV=d;rHS&yjdDwMGV|JDm4o%9elqMc~-z7T9 z=EWXq*^rpjSc4cRHA?Lk^SDf0T1lKIdsMI*X{Q!!v_{&q;wfp_IYNUdlDa4kQ{p9= zSYIjsmFx{sChIoQlxXy@N!pNznPmB9LW9VYN{J7oGCwC1EtSLzWYgl3wAy(SpZhGd w?3U~-%I^o|l6~Ai(PSxDfs-1a`!c}B#5-oT=I%enli!=!p!Xh=(b?tLztn7WVgLXD diff --git a/Marlin/lib/proui/stm32f1/libproui_abl_ultipanel.a b/Marlin/lib/proui/stm32f1/libproui_abl_ultipanel.a index 531c9c2f77dd538ad9711d857cb0e484018986b4..61c455fb1b496781abd86ebc64f87a2a17465c96 100644 GIT binary patch delta 8076 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 TF^~x^v+43oDL5zS-9JYFpC==D delta 111 zcmcccfaSsimI>1ACZ?8VrluAfl{SjQ*qd*OvlhcS&$^cK!8wy=D$2k)ySC1R>)#x8 TF^~x^v+43oDL5zS-9JYFw#g&t diff --git a/Marlin/lib/proui/stm32f1/libproui_mbl_ultipanel.a b/Marlin/lib/proui/stm32f1/libproui_mbl_ultipanel.a index d413c469c8cee0b630bfd8bd856b79a3c2578179..b43bdabe4aed14bb2aa1377d92b751c296c753b3 100644 GIT binary patch delta 5998 zcmb7I4RBS}5#D=ANO%eGl8H$Q>EjvVy(xqwBoR|4qpuhhYaqWs0)YewAyt$Ngo-W0 z%P_H^AOtqmR3k*o2vtU+!HN|ntyWN}{Fn}mMW7a2rc$6*NBSf5+jBPpZ>lrBGw*!w z+ugHgch8=4U-IY$>(g^q`^cCHrp@qrOdHFZx z=kctCu9d}q7;=8ttsO({|MqK_Xq zDuRy%7ym8zBvLNj8bx6>Cz1(e5ff(Xgmg0@kHX4}4KJY0%2N%WKt13CkNA5fg7-)8 zKSo_y-vn?@9d=-HA{A0}^ng1rz^n*f2`(8m8~cg0Btjon{W_yBqRkQdJz_BMNW_PA zf>+|3>8$b$=n^SJF{rgHSZw$txe6 zjKQ6>JHo*U)q4TmMPDipz&@R((DgC+qK^cS8NqYGC4nk@5~(yyx2eF}!*Z%nUStd^ zX+ea8H4*%IwJ$XG)96ry{;cYK(5KT3N{{sdm~MEunwF?Q0!XKs^bGjGBN^;eeHp$d z(rkK1`Bua0=tJdFk#w3%V~1Sb6Ag5`@{qA_q#EV5!o&0fYEeP1F}R0TEB6ArmtIvK zgg%`X)8CbcjQtXdM`}{i<%YM=DCM61ewwJf%jh4VDas|_a3ZasCI|)|$@pP4Xu|hI z9MLBu^e;v5_apd6IzMFQuc9xNdlhUWf1DTaZmf?5R?`>=1|A6@Uk&!-dm=qVx2ay% zNuW(MMY&|1Kx=8a@+iaGY1K9Q4fNnO`t`K&D~`QOphxJ*xZXWu<_+pym0c5?@DNcN z9QlB9tn7#R?1WKautmafl$!+~@$NBuy;pd917tF5EiPEmLoTTZO4xx-s^92wA23nu zffBawr$ocV?osbPwmWfl!0n$A$z>3>ANL&ko*-PEP&}#OZ6;h);9H204f&o@2P?fa z0#6eKMc;~#=pQ3W75+m{Z?|Y5Xb(wS?1F-jO9En_E*s^8fr$tP@lXV|dJY5I)$kWY zBV+<_f?`PV`-)9KS-@2CIj!Ul&!6vE4Fo8G1b{_qACeb^Oq5ImNW+x2M@#*}l?7#j z??vx^lt4;^_Y#h^7g)XOB@od!3qs!tv{w8?iwabgb{w0yg0EQ-m zR-(a>`+kL>1YhZ!_577m zrHUM-$^_ag%wCz&NeRE&O9Y$@9>9E4Qt*)KWvfJPny?SPz;&_;ho!&?j?50c;e+ z5l0Ui-m17p<()vOOqXCQQMX`^w{YP1T4!Wz`Vj%gLhnOjNrHVUKk8LX_(VBb@}&$0 z;;>4vgs57vRuCE13$Dg53PD8EBnZ1jf^9^TfB|G|`Ue^M!F{Y-hJcI2uGOnR;MkSG z{Bp7+fDwX-EK7NwVhAV`O{pK$QkQF~5ts=a+yo9Zfdl2_NkCCRDY*#@0cEN`Sw|`t zP8Y)uuABhV90(*y46uN4(C0Om1em6BIT^CRK#3E0<3+)>To^4@9@M8=K4z=?st zQGXNpaa|DjKO?Wx$blwutXd=v!LKRt{~LH1nU%niWL6;v2MvPA>~2BmmkT1Z6@thN zrlu!41d&;%AToOx7&xW35R@h{Y(c8%;WSO~PkLK{OHYJlVL!e|w~i154+$yD~x z1o*Kw8KS6$-2O9Bt>8jE9j$sg{-UShqk$5CV}-*elU#B16D={)mWAzaC~*?>5~v9n zfo3QlBM6=+h)PWc+O2w8dc2D(aOO&28RqN+;s98zXe!WWZY*;XnhOiO zN%TjE?h^!GDR|g>llpKvusdWg)-78_WVQ^vQ{`RgKV#6XxK(kx;ts)nA_Q+LvP-aB zZ?v^qf!B1)P!R`usX(qExLn1;L&{N9!^@P1aR(bgy&xPm3cl_gA91imIC{fm2HvK8 zy&$+`B>K&QXi^g(dSo}aG-sb6GJjLBhe#3%{1rp?(g*HsnagiCU)TGa?*)fiYdNlT zBwv~u&v~V3LrY*0kI&=yY&4pwrSZH9nue=19Y(XcG~RlQpDT5(F2m1(@8f@iA2$5v zvUuwV-&N*vdRZE;2Rq77l)2V%qdfusA%9Y~*BZ~ym5;W9e6ZZL+p_p#xnni(s0!EK zlf{!O9P1P>205O^ogf!^FUZ*}J_8cZ!z*3;KUrK@=~&rZSLs?wyc%POcVf)oqZpg{ zGR7iytK8@vHZC--tQs9%I}Qhwe_S=%>gO$0uH7<@_g6XgMVl`GR*d7+X^xf3w@h>G zj&a-sQp6iTc8ufQAWeJ{2%+IA)d$H#xJg4>8$fU+ajk1_&E?Ko$J)+& zL3ZWx8IV36KHIgA#d6vFWS%WtS+sh#?BY&n4-DC~G?~vq*)e|89LK&e zgfr(jP?pYt)A76QL`E?x{q^b$)wm9=F#yc3Yez z#_vILAdgQ$(iMmOPv$_q-#(qkx%G~UJJA*R^}% zxqA-Moa?vu0C&Aw{{A7c0(FYcYK4*dO85sLHjPV3-!}u{DT;STD`}yJm$G+_6 zV54IV;yW6ppBFc}_TmK2UFHn!NKHHd%mL0xu%vJwx zOtrqtH4DF!)gv!IqUZtxnRrL0Q0z-~Q2xbu_5TnL{mr7@XBYMlijIP15-+{y4J)Ti2*d>h7t#eSIn2Et-;X@`A5@0IUM)ms>7ZegIjK1BYa;vU7f6b~tWpm;_Q0e+@< zN$`3EV*%6g1{VZRRvxtQ<`hAO3QB+yd6^(0t`bE0)rz%(IJEW38EMv@7pW-l@DxdAH(L#q9=r`DKHh*aiC@OJh)=e- x_M$=D+=xTH%x}HVIm_Ik(l8;s3Zy@VN$cW;5nkq6Exc{n)m@w1du~~#{a<3PuLA%8 delta 6263 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 ai&|_g7S{3qwmNPVi<9{>?b#$A%=-s=JfzG3 delta 2668 zcmb`}eN5DK90%~v_ml@g^Z@e?>ERBIQ&hMEggaCQK9CnE_>6Na$kAw;9jU2J1*|PB zwhqtnspi(%TCrvh#KLF5oKg7z<{b7g!8FO4fwg&+X`lD~ez@|_>^69RKdRVU@~&|8#=OZt1q$EE_XSdN(wmO-1qxLHS$WRgTX$Nmd6qoMyB7mHwq6Vrzjra< z-7C4>98i&DrG6FiL^$R{^9l~cj4jT4JwSH$3{#0SzwaVzcyR5Wrp@kJ3%WMB{lUz+ z>4;fuSz?8$gbn#4EMq*luGFoymUZrR1(;dKr-rGGVN3HL&xNiE>A2-O-l zHh-&Stb1V~u?UUz7ONX+$+zDQ2iAwa^gUln^q}R22?nFvogI*sFW+l-{ed4@6aZS&F z?gn|-xR4nsPr#xl-c>{vQI4L^>h6&=EF@ZsOeflaOqLr$x`?Wfi{yzSD^rMSFbI=J zi*yosk&B6TAmx4RL=GeJBQuHKN2bY7f^-n=M%sxQkyD8FAv1{fBdtV-k*P$ZB3FtUi2=Vx2W#&e}32sNv=V&$6PZsGwyG?Zmg^NHJxD@n_ zMt;z@+ywegyIj8zH`rxUbFxhKYK=KE<^Z%DdKq_UVlT!&@~&iA-lr|^0bS<-(9hah zdy3Ev&P@^eMWZTEKi7cfA8 z4k7Zj`%Ub`&=?$+U})hAhcw!GAWfN#Aw+VXNsdDBlg{m!oQ3xKROw#C(WwH95hgAI zE#Xp7ad1mNq@0@|8$`@TIkErTv4&Ne%++#NmTZudChcCH5Ap{$@Io4Smk5t{%H!<; z?8V*Lcmu$mF0hYt(*-&JRe(>q4q$c(bOQEsuYfwB-Kk}Y&_Q-g5jv!i2XvULK}R%d z10CfqP^(79452o*W(c)wR02B26`;>FY6KnUb|DVWQs(+hsZVfprqsn!a}l6}O92f4 zKj2Gl5>Q`hoAiTDvT_QY(kRC%beiXb&S>Nn;sCbTkI61gdoVuB18DqOBfCrJ9Ot@( z&U2kh9(NU}8)KaA;2Y=!^>8n!S6gVw61v2WETJDX@_;ULHRy^)ZJ<7EVw2yh7uZSq@?<+FCihjb5@zk=)tmp^#+Z0Yag+-#LJ_#X`ZX)(2I%U0W+ NI;CplTCc9={tXynoBRL( diff --git a/Marlin/lib/proui/stm32f1/libproui_ubl_ultipanel.a b/Marlin/lib/proui/stm32f1/libproui_ubl_ultipanel.a index 0ebe72e8dfe2e6ff88f7e4878aff69470125c854..74c1aac0780209a17bf09fe28470924ec35fe7bf 100644 GIT binary patch delta 9168 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 J+FjTA{{x2?ZJhuB delta 9330 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 a*AqWMJ?&hdjWhp&Cr?yzd*_pv`u_`3s&AVB diff --git a/Marlin/lib/proui/stm32f4/libproui_abl_dwin.a b/Marlin/lib/proui/stm32f4/libproui_abl_dwin.a index c6aab44e7a42f540a89cb3f247bc75c433999d82..d23bac03d2f8aba19e344c3e4011c5f247c5226d 100644 GIT binary patch delta 1422 zcmbu9UuaWz6vw~6o8B4|TCPpkKWPoUjcw{|s7%`H@8@?u z=lp*6{C@c}Z0lne_0hT&UF{tmU0s{wja#)?36OvNTh+L+tUI>c1(rGg?bqy{zUbWzPD)RH^VU9IoCK*!hQvush+mdY|S7 zWsOGbnmIpiNlwj_f1{cxiQu_p<*U~fe9_t@64ak+wR=+an(DJZpShvb1cjgc*q=~X zxC|aWS`sU5Aq~l|ToRj0;>~tb`nsare;-gqWep9@25D?I65GU6Jx#zn!e(HnFa&%m zYyl1l*8sA@htP*9hx@4X+r3RZR3TwJ@+p zSOt72^a2Ay-r%6H4%jbT1$-u40UQ+ifgxcVa8$S+7#6PNhK04j3E>;Sh|mX&3M+Vr zr)5wLj0tOiabYFEJs=R|yl|~u{`8v8-=aG&dQ}gt&aUH+>ARnOG>|p)gC5=weU%OB zJuaY|_Ko`JeAeK)tJ#n??xnx8&1!(kUWW8RF7VL9O+M;*X{ayg6LyE$c^x;-ZkYaL zH^Q#WasROUmFC!;VOQ$7EjdG-qusfX9%pAbZiL-+`i!tjk zSLw*sIYaqr>s&~0W4Fq2$JlM7lkDDQcYq$A^3m-%LpxtWZIjJq4_F$!YLJhjp7u@F i>1jUsZfeg5wJToQn_s*5S8b2yleLS*rHLB#Ao4%YY+W({ delta 1453 zcmbu9UrbYX6vw~6ORrYSNTsEPiiNgHVTu++WQ)scVs6&RQrL7eP9F?3VF5ET9Akg7 zI<{<@F=IU0B*q6v$g&tsR_~T+A~Qy^#7rN2*u%01XR>4h>u~I0mr7yhl!6J5a+6;^ zzwXesi4iXc$lW&mpZ-}kl*Ju)5CqmkHwtV{4jN3>FmkRV&?XQ?{S6CW81!?p_v{I z*HYbs&yscHR{YE!vbIJWQ=<>8_!lpzAOiFM&0P-|RR(kZbo`#xditJqe3&`lwUh$^ zJX8+DE?M1ZxmprxHBMNFNUR0yxm9mnbxi(Tux+<}@}mOPNNE(-8~cqvE=!GV^KW;t zP#2lMlzJ~VSS9-1*!diz)Ac3$s$P*M=KJ=jpsz<7E0)~#UTPbETOFWV<5Q)9*h^L@ zI*?ma8T&FvKi!$AR6$Blcs19bv}>}4B9(Ttak4^F9cEklrczg^bm~*;zv4Xni^9_7 z*(^EH8NmJ*M*Iz!|muP+SjrK%uZ)|rbUHIoUdwXZ1 zy{jwn4y|>U)B5QUJwLrGxsxALxDjX(Rs(y5VW3A?1H3QX0DK~>0#4?6R#*#smyfUI zIVRi$czA1tn}G^p9pL9yWqoy?&k8G$gt0Ke!F-~Fsciu|g&v?==-`Hgd?-hS>wtdY zR&G$Z7C0tc4SX#00fWK_a7tJY3<=i&=Y-|Jd0}ZYFd`Ed@QttpxG3}j-wMlkhe9{+ zh0T+Z%n_vI?qpk)iF%wrK^!>~xe$Dr1Li$)C5T!Mlkm{hiOjz$I0Gw2R!bRN~ zr)Ddn4>HyIQI%}J6t%x&XIFPkDTgrTK_1l53wuCxr6LR=m@*ilDo)m zlt$UzWVb3;H_Pr8JvAHFe`V*+xt3X{O4A{B#Wrb1o_mg+pDwX$V7E~B7dzw3UAJ

OV diff --git a/Marlin/lib/proui/stm32f4/libproui_mbl_dwin.a b/Marlin/lib/proui/stm32f4/libproui_mbl_dwin.a index 2b62c85643fa19f9eb14d79ffc95b06e9b3e85a1..ba7b5b8d96248206561996f5e96be4c8b9950f48 100644 GIT binary patch delta 135 zcmex!o#oGUmI>1AW`@Sb7RII1ACZ?8V76z6Zl{SjQ*pvG@#WsHspI!(P*xc9I%Ln6tWi4hz!?l71 cHf(+^g`#4|IcFvm0f~#xB~b)qUO#XE05AhCqyPW_ diff --git a/Marlin/lib/proui/stm32f4/libproui_ubl_dwin.a b/Marlin/lib/proui/stm32f4/libproui_ubl_dwin.a index 77243f4bc65005de0cfdb19f61d60cefd711df51..662c4dbf3a923a34049f4409c97e9ec5daa0a34a 100644 GIT binary patch delta 2417 zcmb`|eN5DK90%~v=Z-@}#N#0jwT$EGeBj{@j>8_-4x$s(@@SQ~8G~xZAI^c|l zO>?wCr+h5QAX9OsaneEy6S9o?6l}F>nLuk|GZR`{^iTA8-w#>(XLj51{(N8G&-Zt~ zhwmLNgW(@u4sV=0&Ev|=&CkmTCa*HpmJxgI;Jq%D_)gxnce40@SeySJ&py!mazf`B zbEWO(&FsvY`&!%7;M4Bcqi+rZS#uLQtIn;Qy6+*lbmiKdn;mkIInnHPc>=>%9Hx$W z5^LfewSi@szl<&kjAwh@!IM`XjoZdirm1PdeEeaJbQ6^!?L@1QSwt1c`-q-HW)oE*rxC41>Q!t&K1#F+`4~|h za=M-{GM{KWGMA_U=^|=GI_DGZM3G0d8|fixLFN!8=*7${)OloaS79vwHjB54E16et zi_|CcB5vIkLbfBYLdeKo~mhy5=XiinyE-|UvwF6-jKd3<}L5;#`O0A%s5>%3kR1TA{G>(^1 z=zerK_<+&qO;b83rJ#27+oTb6T-rb7=wlN?HY;&LdRH@d1p7o;9^(V!mCS26(VH^@4ltf8=no-nUZCYAiCLh>{L$$1gDy)YXvnzyR?w(X_n{^UF3=AeMQs&c zsIBn^c^4|BN-4;V8NGR+JZS@Y3>pG0mN8JVvCz3lsZ0tMvBOejAqta$H5_l%4U4a_ zZn4m7tu$!^R~u{kv8GOjmE@1rdSyu&dOA_%S{0*mqpH@515%%%>vkF+-vinu1E6Mu zteHw8_DrSS233IGlp4@m26ce;NH3@*M9o<$Z%a&;%3h<%4|+!`L9GV0g4!eqde@*) z&_3a8rS}Z-W-INNQjqS&(7gj4lr|-a$k3}90vwVtKpDX4R5&aJPK9&9fD@bn5v~P zoX8$p?#xqtRtoZT`3sn|NgZgLG$~p3Xk$#Mu^;-r3`38pJ|F09j*}#h>TGd&*b(m6 u-8vd3;_d_MR2 z-adC6xjJR;-b9C7V2%pP&Tx8%h7C(p zjD%VE-MWQ0{e@EC^{2bDd?#-B3!9g*gY08}{B_FiiS=lX?Jm6LFWP<0zjL4F_DDa^ zAUlol3{MDVt)At_!s3cN4SsTBY_W#~R&72u<5q7_W?smxw}Lp!`wLBXd5S&P52GhI z^-4dPea^9izODJYV!?0Zw+7OE#})Qm?DIIp*p>oz%&Wq|W@GMDjbsP$YrIwt2J!8O z?D^05E%GR&1c->na5$?^6h?W`~FRfdmJ5SFeT8?~@Xf@J9RE2zs=uPAkL~kP> zBl=)GKSVAgIx;>!KAxwMPZQ16hnikM^axTnkJi&-ed2g7MlPm0@|Xp^G(J(TX<0#3 ziOeE;8EMx8A=8L9Ar}$VB3J4Gk?BO+kW-0vARi^#g)Ag$L>3Y4K~5vui_9fzMP_Q_ z$0%Gx?MNrl0c18&2Qo*W5SgJ*q)!(8IMIG&e%Iwt{&fxy$T>R~@?Ck@!6|&S*~j5h z>|mQUVh)j8HaIwr%caS|hP6D1$mXqX370-?u&lPp4-QV`P2!5^Wo*;b?|M-7gWTCMmSQ(IAgE4~DM<3UW0pe-axtEfbsx@5MwwU%ON zC3L_%btCGl(w3<2JSank9%c}9T}DAanroeg(y%Nwl=LfuBX0xUkS5SgllnkEV-tf% zOo~lX8WmTP(jAkkK)*>n=&niKpx>n*bk8K)0wurL7bt~D^#XiupeWP^C&_3EN7<}I z_=4&!2>hi=4WtdS?vYA^jP; z(4C^RQ&xfYm|cyac4Vl<-a0hIeN_wp`m2OLQCN37}Pt=ChI)!Max4$`DI#jKpI-C_4 zUeuwKWN|Rhl+bk?VVn8yyO%7XS-PbYp*Jl{x6F}JkViOMsTH(Ve4wqEiIfr0dzd!( zBeTn$t<)*2K&Q>U8bRl!P08Y#>Wv;woK>kmrnvkKdhHi`R}Ig%*6MM}q>VY;YwNY? cFW1r>PX6cr_Q)9sJN39y9vO@|x-!8a6jJrGuNa`0Wt-GM@4X#B!eaa)$qh+1vi(>1F!C zXl6{GU$c0ba%^;MCRv`ohVuqnX%FHOLtH0#hG;W$-v?&&+D6-qO#)DdTrPv zAOH2?2i|P!8wngljVmjHu->>YxA0dke`M|h3nsW0mB-s)`F9yxwz)aGK)sVgPM>DE zogQqwX)-^w@1CPl%=%g`Ok&9wWnYUWO`hwEopcxtK4v{?=A!IAnMs<5V_Y3ptACma zXU877XLesjXIp2hzsuXj9k5me97eRsM5xU5qrXF5n*AXZX?+hTcD`zcV}|7QA+yTa zv9c94$X2#iK2#;=FKsSy&4_iVdU+-fgEMQ?nO4XC_^DPNnybznoSP7$H`8)i*Tl4p zT{$AYk*|DPQ6JE-^zl%&PUU+A;6)*7|Fym?vvq!2$cBX-g$JI0qI>sC-Fsf>g6;K- z)$*5BYmJ8Pz0b7BFBY2P&9qxV1h|{I9%yH70J@k}zyW3n(4*MPtOky%d|dG@W({zL zSq_|4{8({9af(?1Twt1r~VTf4ro$)p>IC_ch01@t!Gce4o2S%7tx=N-2yw6+-j57;?bIg3;Q)U4$ z!7Kx^%v*pdW)bjp=IYfQhPXp+&sEdEDm~zn{W*`(P9u=-gM`}P6rxKJqsS1nzsqZOgDJQ53i$Tt|DM*~Q>xBp#XK5F& zOds*t&$9i@KE(DsSj`|9~<3x`}Gd|nWXr`QOfnz(^M(pRvibh^6 zwntdqWq-ttE!5a7y+ghson+kh>LiCr*4cOJBIKIR19ofj>CvF*vHNtf;h%4$ceA?q Nvh)TsUM{A#{0$|vWmW(H delta 1731 zcmb`HZERCj7{~wTws$YEmF@*f+c|GrUB^}!D|@jLObrCrmEa5!ml%j_Osk8ELUd|e zk)TMj;Ko_Ggf21yOk?(8O`B+ZnKju5WBky?nV2AE3xr`Jvl4KT2=zSO+2Z!md6Rp7 z=l_46=iKv_J3OlPf35b~bL;ATjkS%wn6q994}uw%@s{_3E$0m{r}%%UZTye3=dqpM z_^9Fb>iNy&qlq=~l(nX3kx@1jHO(9G(Zr7ndoR*0@mQ*@Y(7f$#`?xhUak#QDy2ny z?~Ru5Q1JLjSrVrU!M*fMw;6vGt*SXvA zq?YlL$(%=nCT(u$&!>B|_X6a;8yL)H-q8+cKlV1?HPdN$E*Rq9%-C5QzdUorRn`0j zqOC`?bpe%A%_+^Dt#voUgH%Pc`*AnF^1IKDY4!jr-kQ!u|FlI;WliAbwdD31{z|%% zk2K`QpGkku*g$;!O@qR2@!DI*!jlXOk6HB6OY~}GAqcrdUn#HapzIK zyM@0#>kIqEL{?M+O~iFT8?g#_iC6)=Nwfk-Bu@~lfipx8a6$URk_qB^AW19-zLT7g z{6+E_@qUDnrj7>Oku-|ck~T@&h#LTnSR?M1^y`QYU^~$X?3Vfkq6_Gf`hCd{i6ZY4 zsgqfTfuCjIx(xg+X;S72Y(&T0anVlDF%kC@Z9uo=N$C#=DjR`8Vv*P(Vjl1@u@)F6 zmH;Efuop;Brx^H*xEA=5C@x5nxC$5}ZUVj~)&VJ^3QQ0SfuD#g#X^Yrz$9@6aFu8W zt`qMAej}R1y(AWh?G{gb;IADj>*v4Ts}{F7)>opZt<0<@M7f!7$+*~lzAxiuWBj;i z5Aj&WtsXJ}Mjks>!qXWu>xwYuX5FH-MEuOmjz*pk`m|^*kzS#PBj=b~O^O;b)kG$R zmx}x$yeZ)okf(2C!n~nBDn?RGMxZe39wyhW_tE&(dac4NdWx(DeTowOB5|%1AW`@QlhNdPPmAb`Y?8ydO#5SK2KV66-u&Hx4ACiFh=Ij~!;MzAE eY^jui$!^|oL6!-|0UP$}(q$1ACZ?9=#+DWvmAb{DZ1c$mTf{b>5YUAoBp|*yd&WMv g_RR)cDrI1@n>SpLWrA_QdS6|-EQKO)>+KZ>00;vtegFUf diff --git a/Marlin/lib/proui/stm32g0/libproui_ubl_dwin.a b/Marlin/lib/proui/stm32g0/libproui_ubl_dwin.a index f99f332597e44d239e93b5ea80fdb27d7ce3f1ac..6e94d10abd4451e58cc6bada151f458e98aa2137 100644 GIT binary patch delta 1604 zcmb`{e`u6-90&0C=ec`sw_9y@H=FyF_uQR3&u#9u+my5*(?stkBvEb9!dW&JbG1|? za&U(XnlVazmS5QC3nKSN*{D0x3ezE4E@n^^q?m1eKhM4!=AW$x9$uf% z=ll6S_r1?O-1!Op+7Hd35;%MXkk@7cC?Z{97{`WV{+?t-r9r^7OKMZh86$6d%7r&sd-RR`p0oj{9 zWc6u&r`3a+2eP@rj`auQKa>n&HNqHZrUve|S5IUy-<6+vJJx4#eSd7oG8zgz=YQ6i ziE{DWWS`L!W`Cv(t0`H(u)qS);lk@xDT zYP6EZiF(twh-?~N7Ju33ExKezZu+9-8s;yzjFzhWNdi2`L*%~ojhcD&7ej2;X_2UL zQAzpprT|>pNe0b%RLe(3->=`Dj-dSjR30TG&dU zoecrI*%F{z*~?Y|2UR|xJjPZ7r`RRH8RcinapeWp2TZUA68L#G!0*btN~iput`$H& zTLYA`1`uHVKm!{9cpjWLvq7Lu<$IKUtn53i@>9z5Ry_fHs|r)fyVe5W)Mg)SuyO)n z<;@gAj3WkTwwEo@6#u9sY$2Dgsp(8#PM0aoaGOuRg}3UZDKvMLv%1nVKV*VEOSC!XU>Q`kK_wc&s-GGOSC_2 zqQ^ravWb&iEfn8yb&1`~q>4Q6+5kCh$a7j(SOmSYsX;U{kBeOrZG+t$I#=ZN*#X(! zrCO1&o9@w&J}k?%;#V&P9hY-}t(tJZMgi&;j}}tpz5hn(eTDR0>0BkK7{{cV0 BiwXb$ delta 1742 zcmb`{e`s4(6bJC{eR(f!)|ur;&AOy+?-pLiLdLGW@up|V-(hrmWp!_FrW<46f26Iv#w58^N?4r)ygl~Qa4!nRSD zKNHWidOInj7^TITs9QT~3#6KRW8)h#XhaqI4zPNfp@zptu{5i^a5{QYr~IjCe?xH) z@$WYt)8`|UWd7rEyS{MgPo_`mZ$v5kdbGbd^NxPBc(d0`Z7#Lx>3A|$k#r_$1`M^b zXq7U0G~lyNRkWL@=OzO+vCGIDIHp%eHIwSSdZ>8CPz+%dg0axUA@j_9qYu;UUIdR! zm!M~Qy?j7V^tYS2mMv!tR%346r475-myDeq`H3-$!v5fs7Iq>%!LW2V#AtR!e7CYx z2Gt`g;$17^W*P4m*Kwi@dsoz-S{|D-x7{PxRCbxUb|jyBX5W)9ceK6uLZajF;ppxp zH?8c6(nPW&kxF&E!e^}PL0(m$iUFs$40G-?-_MFVulLpX2`hop2 zewGXXT{3=C`aUVSEESTAT.bit.PSZ, +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE - eeprom_exclude_size; } + +/* +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE - eeprom_exclude_size; } + const uint8_t psz = NVMCTRL->SEESTAT.bit.PSZ, sblk = NVMCTRL->SEESTAT.bit.SBLK; - return (!psz && !sblk) ? 0 - : (psz <= 2) ? (0x200 << psz) - : (sblk == 1 || psz == 3) ? 4096 - : (sblk == 2 || psz == 4) ? 8192 - : (sblk <= 4 || psz == 5) ? 16384 - : (sblk >= 9 && psz == 7) ? 65536 - : 32768;*/ + return ( + (!psz && !sblk) ? 0 + : (psz <= 2) ? (0x200 << psz) + : (sblk == 1 || psz == 3) ? 4096 + : (sblk == 2 || psz == 4) ? 8192 + : (sblk <= 4 || psz == 5) ? 16384 + : (sblk >= 9 && psz == 7) ? 65536 + : 32768 + ) - eeprom_exclude_size; } +*/ uint32_t PAGE_SIZE; uint32_t ROW_SIZE; @@ -99,8 +104,7 @@ bool PersistentStore::access_finish() { volatile uint32_t *dst_addr = (volatile uint32_t *) &flashdata; uint32_t *pointer = (uint32_t *) buffer; - for (uint32_t i = 0; i < TOTAL_FLASH_SIZE; i+=4) { - + for (uint32_t i = 0; i < TOTAL_FLASH_SIZE; i += 4) { *dst_addr = (uint32_t) *pointer; pointer++; dst_addr ++; @@ -120,19 +124,19 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui if (!hasWritten) { // init temp buffer buffer = (uint8_t *) malloc(MARLIN_EEPROM_SIZE); - hasWritten=true; + hasWritten = true; } - memcpy(buffer+pos,value,size); + memcpy(buffer + REAL_EEPROM_ADDR(pos), value, size); pos += size; return false; } bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { - volatile uint8_t *dst_addr = (volatile uint8_t *) &flashdata; - dst_addr += pos; + volatile uint8_t *dst_addr = (volatile uint8_t *) &flashdata; + dst_addr += REAL_EEPROM_ADDR(pos); - memcpy(value,(const void *) dst_addr,size); + memcpy(value, (const void *)dst_addr, size); pos += size; return false; } diff --git a/Marlin/src/HAL/SAMD21/eeprom_qspi.cpp b/Marlin/src/HAL/SAMD21/eeprom_qspi.cpp index 587dcb0..12977a1 100644 --- a/Marlin/src/HAL/SAMD21/eeprom_qspi.cpp +++ b/Marlin/src/HAL/SAMD21/eeprom_qspi.cpp @@ -38,7 +38,7 @@ static bool initialized; -size_t PersistentStore::capacity() { return qspi.size(); } +size_t PersistentStore::capacity() { return qspi.size() - eeprom_exclude_size; } bool PersistentStore::access_start() { if (!initialized) { @@ -56,7 +56,7 @@ bool PersistentStore::access_finish() { bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { while (size--) { const uint8_t v = *value; - qspi.writeByte(pos, v); + qspi.writeByte(REAL_EEPROM_ADDR(pos), v); crc16(crc, &v, 1); pos++; value++; @@ -66,7 +66,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { while (size--) { - uint8_t c = qspi.readByte(pos); + const uint8_t c = qspi.readByte(REAL_EEPROM_ADDR(pos)); if (writing) *value = c; crc16(crc, &c, 1); pos++; diff --git a/Marlin/src/HAL/SAMD21/eeprom_wired.cpp b/Marlin/src/HAL/SAMD21/eeprom_wired.cpp index ab71e61..da0eb1b 100644 --- a/Marlin/src/HAL/SAMD21/eeprom_wired.cpp +++ b/Marlin/src/HAL/SAMD21/eeprom_wired.cpp @@ -42,7 +42,7 @@ #ifndef MARLIN_EEPROM_SIZE #error "MARLIN_EEPROM_SIZE is required for I2C / SPI EEPROM." #endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE - eeprom_exclude_size; } bool PersistentStore::access_start() { eeprom_init(); return true; } bool PersistentStore::access_finish() { return true; } @@ -51,7 +51,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui uint16_t written = 0; while (size--) { const uint8_t v = *value; - uint8_t * const p = (uint8_t * const)pos; + uint8_t * const p = (uint8_t * const)REAL_EEPROM_ADDR(pos); if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes @@ -69,7 +69,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { while (size--) { - uint8_t c = eeprom_read_byte((uint8_t*)pos); + const uint8_t c = eeprom_read_byte((uint8_t*)REAL_EEPROM_ADDR(pos)); if (writing) *value = c; crc16(crc, &c, 1); pos++; diff --git a/Marlin/src/HAL/SAMD51/eeprom_qspi.cpp b/Marlin/src/HAL/SAMD51/eeprom_qspi.cpp index 1c82ede..a39e4c4 100644 --- a/Marlin/src/HAL/SAMD51/eeprom_qspi.cpp +++ b/Marlin/src/HAL/SAMD51/eeprom_qspi.cpp @@ -35,7 +35,7 @@ static bool initialized; -size_t PersistentStore::capacity() { return qspi.size(); } +size_t PersistentStore::capacity() { return qspi.size() - eeprom_exclude_size; } bool PersistentStore::access_start() { if (!initialized) { @@ -53,7 +53,7 @@ bool PersistentStore::access_finish() { bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { while (size--) { const uint8_t v = *value; - qspi.writeByte(pos, v); + qspi.writeByte(REAL_EEPROM_ADDR(pos), v); crc16(crc, &v, 1); pos++; value++; @@ -63,7 +63,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { while (size--) { - uint8_t c = qspi.readByte(pos); + const uint8_t c = qspi.readByte(REAL_EEPROM_ADDR(pos)); if (writing) *value = c; crc16(crc, &c, 1); pos++; diff --git a/Marlin/src/HAL/SAMD51/eeprom_wired.cpp b/Marlin/src/HAL/SAMD51/eeprom_wired.cpp index 7a03d4e..00a739a 100644 --- a/Marlin/src/HAL/SAMD51/eeprom_wired.cpp +++ b/Marlin/src/HAL/SAMD51/eeprom_wired.cpp @@ -40,7 +40,7 @@ #ifndef MARLIN_EEPROM_SIZE #error "MARLIN_EEPROM_SIZE is required for I2C / SPI EEPROM." #endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE - eeprom_exclude_size; } bool PersistentStore::access_start() { eeprom_init(); return true; } bool PersistentStore::access_finish() { return true; } @@ -49,7 +49,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui uint16_t written = 0; while (size--) { const uint8_t v = *value; - uint8_t * const p = (uint8_t * const)pos; + uint8_t * const p = (uint8_t * const)REAL_EEPROM_ADDR(pos); if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes @@ -67,7 +67,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { while (size--) { - uint8_t c = eeprom_read_byte((uint8_t*)pos); + const uint8_t c = eeprom_read_byte((uint8_t*)REAL_EEPROM_ADDR(pos)); if (writing) *value = c; crc16(crc, &c, 1); pos++; diff --git a/Marlin/src/HAL/STM32/eeprom_bl24cxx.cpp b/Marlin/src/HAL/STM32/eeprom_bl24cxx.cpp index f30b3de..3e0bb58 100644 --- a/Marlin/src/HAL/STM32/eeprom_bl24cxx.cpp +++ b/Marlin/src/HAL/STM32/eeprom_bl24cxx.cpp @@ -44,7 +44,7 @@ #error "MARLIN_EEPROM_SIZE is required for IIC_BL24CXX_EEPROM." #endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE - eeprom_exclude_size; } bool PersistentStore::access_start() { eeprom_init(); return true; } bool PersistentStore::access_finish() { return true; } @@ -53,7 +53,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui uint16_t written = 0; while (size--) { uint8_t v = *value; - uint8_t * const p = (uint8_t * const)pos; + uint8_t * const p = (uint8_t * const)REAL_EEPROM_ADDR(pos); if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes @@ -71,8 +71,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { do { - uint8_t * const p = (uint8_t * const)pos; - uint8_t c = eeprom_read_byte(p); + const uint8_t c = eeprom_read_byte((uint8_t*)REAL_EEPROM_ADDR(pos)); if (writing) *value = c; crc16(crc, &c, 1); pos++; diff --git a/Marlin/src/HAL/STM32/eeprom_flash.cpp b/Marlin/src/HAL/STM32/eeprom_flash.cpp index 69511c6..37963ad 100644 --- a/Marlin/src/HAL/STM32/eeprom_flash.cpp +++ b/Marlin/src/HAL/STM32/eeprom_flash.cpp @@ -101,7 +101,7 @@ static bool eeprom_data_written = false; #ifndef MARLIN_EEPROM_SIZE #define MARLIN_EEPROM_SIZE size_t(E2END + 1) #endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE - eeprom_exclude_size; } bool PersistentStore::access_start() { @@ -245,14 +245,15 @@ bool PersistentStore::access_finish() { bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { while (size--) { uint8_t v = *value; + const int p = REAL_EEPROM_ADDR(pos); #if ENABLED(FLASH_EEPROM_LEVELING) - if (v != ram_eeprom[pos]) { - ram_eeprom[pos] = v; + if (v != ram_eeprom[p]) { + ram_eeprom[p] = v; eeprom_data_written = true; } #else - if (v != eeprom_buffered_read_byte(pos)) { - eeprom_buffered_write_byte(pos, v); + if (v != eeprom_buffered_read_byte(p)) { + eeprom_buffered_write_byte(p, v); eeprom_data_written = true; } #endif @@ -265,7 +266,8 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { do { - const uint8_t c = TERN(FLASH_EEPROM_LEVELING, ram_eeprom[pos], eeprom_buffered_read_byte(pos)); + const int p = REAL_EEPROM_ADDR(pos); + const uint8_t c = TERN(FLASH_EEPROM_LEVELING, ram_eeprom[p], eeprom_buffered_read_byte(p)); if (writing) *value = c; crc16(crc, &c, 1); pos++; diff --git a/Marlin/src/HAL/STM32/eeprom_sdcard.cpp b/Marlin/src/HAL/STM32/eeprom_sdcard.cpp index 1b5c0ae..071d0ba 100644 --- a/Marlin/src/HAL/STM32/eeprom_sdcard.cpp +++ b/Marlin/src/HAL/STM32/eeprom_sdcard.cpp @@ -40,7 +40,7 @@ #ifndef MARLIN_EEPROM_SIZE #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE - eeprom_exclude_size; } #define _ALIGN(x) __attribute__ ((aligned(x))) static char _ALIGN(4) HAL_eeprom_data[MARLIN_EEPROM_SIZE]; diff --git a/Marlin/src/HAL/STM32/eeprom_sram.cpp b/Marlin/src/HAL/STM32/eeprom_sram.cpp index 9bd84ff..58a67f1 100644 --- a/Marlin/src/HAL/STM32/eeprom_sram.cpp +++ b/Marlin/src/HAL/STM32/eeprom_sram.cpp @@ -33,7 +33,7 @@ #ifndef MARLIN_EEPROM_SIZE #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE - eeprom_exclude_size; } bool PersistentStore::access_start() { return true; } bool PersistentStore::access_finish() { return true; } diff --git a/Marlin/src/HAL/STM32/eeprom_wired.cpp b/Marlin/src/HAL/STM32/eeprom_wired.cpp index 6fb9d9b..5440030 100644 --- a/Marlin/src/HAL/STM32/eeprom_wired.cpp +++ b/Marlin/src/HAL/STM32/eeprom_wired.cpp @@ -38,7 +38,7 @@ #ifndef MARLIN_EEPROM_SIZE #define MARLIN_EEPROM_SIZE size_t(E2END + 1) #endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE - eeprom_exclude_size; } bool PersistentStore::access_start() { eeprom_init(); return true; } bool PersistentStore::access_finish() { return true; } @@ -47,7 +47,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui uint16_t written = 0; while (size--) { uint8_t v = *value; - uint8_t * const p = (uint8_t * const)pos; + uint8_t * const p = (uint8_t * const)REAL_EEPROM_ADDR(pos); if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes @@ -66,7 +66,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { do { // Read from either external EEPROM, program flash or Backup SRAM - const uint8_t c = eeprom_read_byte((uint8_t*)pos); + const uint8_t c = eeprom_read_byte((uint8_t*)REAL_EEPROM_ADDR(pos)); if (writing) *value = c; crc16(crc, &c, 1); pos++; diff --git a/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp b/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp index 4e25bc6..1252e77 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp @@ -41,7 +41,7 @@ #error "MARLIN_EEPROM_SIZE is required for IIC_BL24CXX_EEPROM." #endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE - eeprom_exclude_size; } bool PersistentStore::access_start() { eeprom_init(); return true; } bool PersistentStore::access_finish() { return true; } @@ -50,7 +50,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui uint16_t written = 0; while (size--) { uint8_t v = *value; - uint8_t * const p = (uint8_t * const)pos; + uint8_t * const p = (uint8_t * const)REAL_EEPROM_ADDR(pos); if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes @@ -68,8 +68,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { do { - uint8_t * const p = (uint8_t * const)pos; - uint8_t c = eeprom_read_byte(p); + const uint8_t c = eeprom_read_byte((uint8_t*)REAL_EEPROM_ADDR(pos)); if (writing) *value = c; crc16(crc, &c, 1); pos++; diff --git a/Marlin/src/HAL/STM32F1/eeprom_flash.cpp b/Marlin/src/HAL/STM32F1/eeprom_flash.cpp index 48fb2d2..afdfefd 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_flash.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_flash.cpp @@ -41,7 +41,7 @@ #ifndef MARLIN_EEPROM_SIZE #define MARLIN_EEPROM_SIZE ((EEPROM_PAGE_SIZE) * 2) #endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE - eeprom_exclude_size; } static uint8_t ram_eeprom[MARLIN_EEPROM_SIZE] __attribute__((aligned(4))) = {0}; static bool eeprom_dirty = false; diff --git a/Marlin/src/HAL/STM32F1/eeprom_sdcard.cpp b/Marlin/src/HAL/STM32F1/eeprom_sdcard.cpp index 9cfa97c..6b72193 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_sdcard.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_sdcard.cpp @@ -39,7 +39,7 @@ #ifndef MARLIN_EEPROM_SIZE #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE - eeprom_exclude_size; } #define _ALIGN(x) __attribute__ ((aligned(x))) // SDIO uint32_t* compat. static char _ALIGN(4) HAL_eeprom_data[MARLIN_EEPROM_SIZE]; diff --git a/Marlin/src/HAL/STM32F1/eeprom_wired.cpp b/Marlin/src/HAL/STM32F1/eeprom_wired.cpp index bc48eef..bfb7718 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_wired.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_wired.cpp @@ -36,7 +36,7 @@ #ifndef MARLIN_EEPROM_SIZE #error "MARLIN_EEPROM_SIZE is required for I2C / SPI EEPROM." #endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE - eeprom_exclude_size; } bool PersistentStore::access_finish() { return true; } @@ -57,7 +57,7 @@ bool PersistentStore::access_start() { bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { uint16_t written = 0; while (size--) { - uint8_t * const p = (uint8_t * const)pos; + uint8_t * const p = (uint8_t * const)REAL_EEPROM_ADDR(pos); uint8_t v = *value; if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); @@ -76,7 +76,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { do { - uint8_t c = eeprom_read_byte((uint8_t*)pos); + const uint8_t c = eeprom_read_byte((uint8_t*)REAL_EEPROM_ADDR(pos)); if (writing && value) *value = c; crc16(crc, &c, 1); pos++; diff --git a/Marlin/src/HAL/TEENSY31_32/eeprom.cpp b/Marlin/src/HAL/TEENSY31_32/eeprom.cpp index d1ff940..a7e5e59 100644 --- a/Marlin/src/HAL/TEENSY31_32/eeprom.cpp +++ b/Marlin/src/HAL/TEENSY31_32/eeprom.cpp @@ -36,7 +36,7 @@ #ifndef MARLIN_EEPROM_SIZE #define MARLIN_EEPROM_SIZE size_t(E2END + 1) #endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE - eeprom_exclude_size; } bool PersistentStore::access_start() { return true; } bool PersistentStore::access_finish() { return true; } @@ -44,7 +44,7 @@ bool PersistentStore::access_finish() { return true; } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { uint16_t written = 0; while (size--) { - uint8_t * const p = (uint8_t * const)pos; + uint8_t * const p = (uint8_t * const)REAL_EEPROM_ADDR(pos); uint8_t v = *value; if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); @@ -63,7 +63,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { do { - uint8_t c = eeprom_read_byte((uint8_t*)pos); + const uint8_t c = eeprom_read_byte((uint8_t*)REAL_EEPROM_ADDR(pos)); if (writing) *value = c; crc16(crc, &c, 1); pos++; diff --git a/Marlin/src/HAL/TEENSY35_36/eeprom.cpp b/Marlin/src/HAL/TEENSY35_36/eeprom.cpp index a2afa45..977cd70 100644 --- a/Marlin/src/HAL/TEENSY35_36/eeprom.cpp +++ b/Marlin/src/HAL/TEENSY35_36/eeprom.cpp @@ -35,7 +35,7 @@ #ifndef MARLIN_EEPROM_SIZE #define MARLIN_EEPROM_SIZE size_t(E2END + 1) #endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE - eeprom_exclude_size; } bool PersistentStore::access_start() { return true; } bool PersistentStore::access_finish() { return true; } @@ -43,7 +43,7 @@ bool PersistentStore::access_finish() { return true; } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { uint16_t written = 0; while (size--) { - uint8_t * const p = (uint8_t * const)pos; + uint8_t * const p = (uint8_t * const)REAL_EEPROM_ADDR(pos); uint8_t v = *value; if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); @@ -62,7 +62,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { do { - uint8_t c = eeprom_read_byte((uint8_t*)pos); + const uint8_t c = eeprom_read_byte((uint8_t*)REAL_EEPROM_ADDR(pos)); if (writing) *value = c; crc16(crc, &c, 1); pos++; diff --git a/Marlin/src/HAL/TEENSY40_41/eeprom.cpp b/Marlin/src/HAL/TEENSY40_41/eeprom.cpp index 87f7dd3..357fed4 100644 --- a/Marlin/src/HAL/TEENSY40_41/eeprom.cpp +++ b/Marlin/src/HAL/TEENSY40_41/eeprom.cpp @@ -35,7 +35,7 @@ #ifndef MARLIN_EEPROM_SIZE #define MARLIN_EEPROM_SIZE size_t(E2END + 1) #endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE - eeprom_exclude_size; } bool PersistentStore::access_start() { return true; } bool PersistentStore::access_finish() { return true; } @@ -43,7 +43,7 @@ bool PersistentStore::access_finish() { return true; } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { uint16_t written = 0; while (size--) { - uint8_t * const p = (uint8_t * const)pos; + uint8_t * const p = (uint8_t * const)REAL_EEPROM_ADDR(pos); uint8_t v = *value; if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); @@ -62,7 +62,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { do { - uint8_t c = eeprom_read_byte((uint8_t*)pos); + const uint8_t c = eeprom_read_byte((uint8_t*)REAL_EEPROM_ADDR(pos)); if (writing) *value = c; crc16(crc, &c, 1); pos++; diff --git a/Marlin/src/HAL/shared/eeprom_api.h b/Marlin/src/HAL/shared/eeprom_api.h index 7be1e72..763271b 100644 --- a/Marlin/src/HAL/shared/eeprom_api.h +++ b/Marlin/src/HAL/shared/eeprom_api.h @@ -26,6 +26,19 @@ #include "../../libs/crc16.h" +// For testing. Define with -DEEPROM_EXCL_ZONE=919,926 in INI files. +//#define EEPROM_EXCL_ZONE 919,926 // Test a range +//#define EEPROM_EXCL_ZONE 333 // Test a single byte + +#ifdef EEPROM_EXCL_ZONE + static constexpr int eeprom_exclude_zone[] = { EEPROM_EXCL_ZONE }, + eeprom_exclude_size = eeprom_exclude_zone[COUNT(eeprom_exclude_zone) - 1] - eeprom_exclude_zone[0] + 1; + #define REAL_EEPROM_ADDR(A) (A < eeprom_exclude_zone[0] ? (A) : (A) + eeprom_exclude_size) +#else + #define REAL_EEPROM_ADDR(A) (A) + static constexpr int eeprom_exclude_size = 0; +#endif + class PersistentStore { public: diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index dc96b46..462f67b 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -1841,7 +1841,8 @@ bool unified_bed_leveling::smart_fill_one(const uint8_t x, const uint8_t y, cons print_hex_word(i); SERIAL_ECHOPGM(": "); for (uint16_t j = 0; j < 16; j++) { - persistentStore.read_data(i + j, &cccc, sizeof(uint8_t)); + int pos = i + j; + persistentStore.read_data(pos, &cccc, sizeof(uint8_t)); print_hex_byte(cccc); SERIAL_CHAR(' '); } diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index d4b0daa..29b7423 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -712,7 +712,7 @@ static_assert(settingsdata_size <= MARLIN_EEPROM_SIZE, "EEPROM too small to cont MarlinSettings settings; -uint16_t MarlinSettings::datasize() { return settingsdata_size; } +uint16_t MarlinSettings::datasize() { return sizeof(SettingsData); } /** * Post-process after Retrieve or Reset @@ -797,7 +797,8 @@ void MarlinSettings::postprocess() { bool MarlinSettings::sd_update_status() { uint8_t val; - persistentStore.read_data(SD_FIRMWARE_UPDATE_EEPROM_ADDR, &val); + int pos = SD_FIRMWARE_UPDATE_EEPROM_ADDR; + persistentStore.read_data(pos, &val); return (val == SD_FIRMWARE_UPDATE_ACTIVE_VALUE); } @@ -850,9 +851,6 @@ void MarlinSettings::postprocess() { #define EEPROM_READ(V...) do{ SERIAL_ECHOPGM("READ: ", F(STRINGIFY(FIRST(V)))); EEPROM_READ_(V); SERIAL_ECHOLNPGM(" CRC: ", working_crc); }while(0) #define EEPROM_READ_ALWAYS(V...) do{ SERIAL_ECHOPGM("READ: ", F(STRINGIFY(FIRST(V)))); EEPROM_READ_ALWAYS_(V); SERIAL_ECHOLNPGM(" CRC: ", working_crc); }while(0) #define EEPROM_WRITE(V...) do{ SERIAL_ECHOPGM("WRITE: ", F(STRINGIFY(FIRST(V)))); EEPROM_WRITE_(V); SERIAL_ECHOLNPGM(" CRC: ", working_crc); }while(0) - // #define EEPROM_READ(V...) do{ SERIAL_ECHOLNPGM("READ: ", F(STRINGIFY(FIRST(V)))); EEPROM_READ_(V); }while(0) - // #define EEPROM_READ_ALWAYS(V...) do{ SERIAL_ECHOLNPGM("READ: ", F(STRINGIFY(FIRST(V)))); EEPROM_READ_ALWAYS_(V); }while(0) - // #define EEPROM_WRITE(V...) do{ SERIAL_ECHOLNPGM("WRITE: ", F(STRINGIFY(FIRST(V)))); EEPROM_WRITE_(V); }while(0) #else #define EEPROM_READ(V...) EEPROM_READ_(V) #define EEPROM_READ_ALWAYS(V...) EEPROM_READ_ALWAYS_(V) diff --git a/Marlin/src/pins/stm32f4/pins_CREALITY_V24S1_301F4.h b/Marlin/src/pins/stm32f4/pins_CREALITY_V24S1_301F4.h index 32f70a3..291a67b 100644 --- a/Marlin/src/pins/stm32f4/pins_CREALITY_V24S1_301F4.h +++ b/Marlin/src/pins/stm32f4/pins_CREALITY_V24S1_301F4.h @@ -35,4 +35,6 @@ #define DISABLE_DEBUG false // DISABLE_(DEBUG|JTAG) is not supported for STM32F4. #define ALLOW_STM32F4 +#define EEPROM_EXCL_ZONE 919,926 // Exclude EEPROM area used as bootloader flag zone + #include "../stm32f1/pins_CREALITY_V24S1_301.h"