From 59919c4fb95085df7316f182c2a2799bb4a4a220 Mon Sep 17 00:00:00 2001 From: Frank Voorburg Date: Thu, 1 Dec 2011 22:30:33 +0000 Subject: [PATCH] - Fixed bug in data type of NvmEraseHook return code (blt_bool should have been blt_int8u). - Added support for additional NVM driver in LPC-L2294 Demo's allowing operations on the 2MB external Intel C3 flash. - Corrected the names of some return values for the NMV hooks (BTL_NVM_xxx to BLT_NVM_xxx). - Fixed problem with incorrect xcpInfo.mta value by changing the GCC/Crossworks linker optimazation from -Os to -O1. git-svn-id: https://svn.code.sf.net/p/openblt/code/trunk@11 5dc33758-31d5-4daf-9ae8-b24bf3d40d73 --- .../bin/openbtl_olimex_lpc_l2294_20mhz.elf | Bin 38976 -> 39423 bytes .../bin/openbtl_olimex_lpc_l2294_20mhz.map | 638 ++++++++--------- .../bin/openbtl_olimex_lpc_l2294_20mhz.srec | 577 ++++++++-------- .../Boot/extflash.c | 643 +++++++++++++++++ .../Boot/extflash.h | 45 ++ .../Boot/hooks.c | 26 +- .../Boot/ide/lpc2294_crossworks.hzp | 4 +- .../Boot/ide/lpc2294_crossworks.hzs | 7 +- .../Boot/lpc2294.h | 2 +- .../Boot/main.c | 23 + .../bin/demoprog_olimex_lpc_l2294_20mhz.elf | Bin 56697 -> 56734 bytes .../bin/demoprog_olimex_lpc_l2294_20mhz.map | 24 +- .../Prog/ide/lpc2294_crossworks.hzp | 2 +- .../Prog/ide/lpc2294_crossworks.hzs | 5 +- .../Prog/main.c | 19 + .../Prog/memory.x | 4 +- .../bin/openbtl_olimex_lpc_l2294_20mhz.elf | Bin 65005 -> 64225 bytes .../bin/openbtl_olimex_lpc_l2294_20mhz.hex | 647 ++++++++---------- .../bin/openbtl_olimex_lpc_l2294_20mhz.map | 143 ++-- .../Boot/extflash.c | 643 +++++++++++++++++ .../Boot/extflash.h | 45 ++ .../Boot/hooks.c | 26 +- .../Boot/ide/DemoBoot.project | 2 + .../Boot/main.c | 25 +- .../Boot/makefile | 4 +- .../Boot/bin/openbtl_olimex_stm32p103.elf | Bin 47508 -> 48500 bytes .../Boot/bin/openbtl_olimex_stm32p103.map | 628 ++++++++--------- .../Boot/bin/openbtl_olimex_stm32p103.srec | 546 ++++++++------- .../Boot/hooks.c | 18 +- .../Boot/ide/stm32f103_crossworks.hzp | 2 +- .../Boot/ide/stm32f103_crossworks.hzs | 4 +- .../Boot/bin/openbtl_olimex_stm32p103.elf | Bin 104446 -> 104314 bytes .../Boot/bin/openbtl_olimex_stm32p103.map | 210 +++--- .../Boot/bin/openbtl_olimex_stm32p103.srec | 586 +++++++++------- .../Boot/hooks.c | 18 +- .../Boot/makefile | 2 +- Target/Source/ARM7_LPC2000/nvm.c | 16 +- Target/Source/ARM7_LPC2000/nvm.h | 6 +- Target/Source/ARMCM3_STM32/nvm.c | 16 +- Target/Source/ARMCM3_STM32/nvm.h | 6 +- 40 files changed, 3627 insertions(+), 1985 deletions(-) create mode 100644 Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/extflash.c create mode 100644 Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/extflash.h create mode 100644 Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/extflash.c create mode 100644 Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/extflash.h diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/bin/openbtl_olimex_lpc_l2294_20mhz.elf b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/bin/openbtl_olimex_lpc_l2294_20mhz.elf index 7cfc9cc1cb618a4e4c01c9809a08ffa90a9f6a92..eb5e17c1327f18a995fcb79106dd1e829595a7d0 100644 GIT binary patch literal 39423 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 literal 38976 zcmeHwdwi9}o%hW1oZLe=AwdEn9u*W7PEGhY#tk$Zet=ewuw%XdawAJ@TrCqz#l~#9aUEXajq$1iDw)Ji6E${a`^UU+iIRtgz zeXadt=aV@zzsvmQH^2GK<+;q0tqZFzl~UFTFF0blkjPgf&PJTtE<|P~^ASN>i5Rcw zy`Y&;QY-{x77$@XmcJV?3dB`JcKTSzK^j7|L&?!S!|Cy+MCAKNM@}6MgGN329U)pE z^bpd+h_54>@UXLIScdzCM7VbtxZepecHmU8Z|LN3?~puNIR<(rUig8Zg&h^Oxv?h)d(2EYw~8vtJexE63N;99_~fY$p8X1`c zo&gykI6>*NEi!p8(J6s_cYscyF zWy%nKuV`dU&w@EYS0mD z2S#F{K~#N@jPDo>iJGA|&}Q`Ek?p7V4LFf)Ll4LH439*d!5xvOhgXIBhgPAFB>e7{ z@YBP$0M{#!dU-d}H?X(l=L0gYaHt#QV3%CrhI&~x(mzCgmS@Vo7Dz)#Lr5JDmP}83 zdia#N3kF5xj^PaGAR^m`YtWxpBEADVPe!{s;P*2ChhlvLF91h7?RycL^EaV?uIP+D}(Kiq|uyjy}UBiPTBd?8!>Y-AM z+430dRExI6ZXFJZTZgj|i)(KkzHoW}&}!&027OcwJ~#_y zv*OU1Wn;S!m55tk-2{6&5BCj)fy?jHvMNTC6Qi7!L)oIQumG~=LKfwS*j=jrlF+TM zo;O-KaUbTJ4z#0h7Uowqw?q!yI(T%UZf`9x>{AzhAA?qKryz*nn#4`qbmZ!`LaeueR` z>PH#UVxGM@PU0aEr_J47+Gf}A)~!#%7rTaxE>3OVfZOqpL!pk|P*%84LZ16mA@W#X z7V1Nvs`@}1_$hUbR}Yo|r}U|=?+>A$*Y@oh&Zyqe?`*ko@O4T5+A)|BtMAW6d9?8! z>csLt^vY*bX7!Fi*;_d%WB+<6`=-8u={G%sIpar%ehZ(G@ENv;<%}&yu*QWsCS(2R zn{C6{D!*-*e#JJbIlND3`UdE`-^5tqylDK`wk!QuqCSE8N>%&N$6}$X>s(b=%@F*% z2;->;d~gNuBAr1Sikg9Qgt!^$P^h*~o&{VOzAz0qH5PjNhUSV}4;S}h3|!McbSG?U zkAVps1AX+}D~Hf0lV-zj$=?8MZ959#BUuwNc+R4@E^Ar{fIs+8WZU&+%z(Ba)~u2 ziX%eA1$}83#&6dU=Y0pZ|HZp{EM_4OfAHy)NBZ-MzH1P0QKp^+1VF0nA|1AU62&veB6F!TyzT|$~2zGJu;JOcSJQ_yKE7`;DnM2N~v5wAd0 zJdhD$dBkkQu*EwSWv8MZ`c#B+#O=dk-yKM|^<&qIczud&%A{>f=wpL@b!cAP2tJr9>&4kV%DzP&{x!VDbgxL`U?A12>6Q9Yy0qWw3mCE zU7+tq45MwA(FX8W%xk$b*iQ6^#M+*TIx!EtRt6gPZl>O=fIAg2?9C5%dv#GCRUg_h zA9VWAuTdB2YFwe7KL9@s5%WdL7&{kmA>zwkIr@%-ZhGx{4mx3M$DUKy0at=Yje{8M z4?Quz%L}mnW_$X4!K)AR+3;t<%eG}>t%`xi`1L&=&q!Dft_IIkOCOE_wuSpf>S5%K zw|IzWq#hD`P8YnKYeM4b;m4*vt!M{P$7I^wlU0dvx&VBnJ4o5zltDh#KjH=Sm7XgN zUX4eTXE}r8oGD@lhDXqLu8nIJ>=_<|z7iOpZg~H27=Fz<>4PD_alkUNA2!^NeeV9@ zOyIH*vypFrUy54x_v)diAmjIt30vku-p$V=|8?ZydpG|C`8MRAMfx!K{vPFihWx$2 zbz=|vbL1Za{xiV8iTncKGf?gg|YSK54J;w;lcISFzYff{i{;!9u9@EZ;xPqN7}v@UdfMa>*sX|%fr_O z{*3kKaM>QraZeAQKBI3SSM?+3K-e1jY}h>;<39&612Gek{at6(^{^_B`k))@4Y6Mk zGZC}UC)r4I5OWc;L7&I6qHk!KCqrT$VmnP)RZj7G{fjcQ6|bIyBxvZtLN3ED}$O2JQie;oG4oP5vesGm5)`&h&N0U163e_hVGVN%?acNX%e zgKt0P5r_4l&Y2#Kb0qtP^_adn*^?QE-Poo~<)?v7vb=WD9$9GDW3%@Us6D^eSCc&1 zX5Gjo?D+w8WIvWccg*BRB1p$!tWSq-3%ofljD5wG@*wK|Wv0rl!U`U3Up{8;Aq={)b-eb{z_sr28<_MXoA zWQws%d+Iv7VMMP}1oj%LwYXy_??PVUx;iB|GW#n)Ai?w|oRBh>BQqZ){5WGUO^XQPm@nZ6^Nc9Kq%ShuTF<2UsLm0;04^jq zAkSN_AE_$@!)$GRS2z8l3kt2p7+$N#@LDs5*Lv=r;Rk@9GHnUKBTM9(?mRb>z5dRb}^14igT%z>GmW?C(ZEsAipuOLyL_zMzZi%9UC zQoD_2)o!z!JhNKKqg~Z?w5w_lxUrqvwi#(Pr1CY-~;--c39ZFd7CZI8^S?~@irvZ@b!Bp@#3*VvhPm}QuNx4v% zGRAh2{B1{4D4qF5#4jMvI>Ue2}wT$kJjZ;MQZ{stPK39vcy*bkG~i{0tI4- z@_BjEm4JVQc+%zgc?nT*lo*a5JBs5q!|^UM2xD)g4!_psXZ>MJi-oBFv%qT|eywyU zqfW}Yzg9ZjPFQvGE0Vn50z9E5*(T&GavcOe2e@z+g}CwSZqs5ARGY3kj>BtH3J0pr2(h~-%3)L~pOkD-4AJ>CF0dR3 zkuR&>C$10iQ$V@!gp=cnM%Vcwa+6hKUS^+tAK=NVtuM2wzd$@ib;m(6zX1?aB`fRD zekE5xTtPeVz)+WhM__F)KSeoJr*f((%A>lJM@>=g)2-YGioVSfZz)Bo*8x-SH%6@80}t^s(8s`njMyOE%(`dxy%0gh)&`yp^Q1j-zF(rJLdjd;>{{2V|$ z)lefd0m1Df7pQd2X$z5J%g%7RTt)qsYrmm#M-gG+2;8{vceKSyNsZnj{~7Xna+hds za<0u0VkTIZ`RtPv`%=JSs=SK=IyF04A4aSNDUUPNW@OZe8Y`ytQ||hkfyr=rBmK-~ zWTz!*`M>96k>T<-=(I6Jd`}~IZ_3*&WCQJO7QT$E3BQAkQJ3=%vROC}wK^geNah0o z6P`gPAHJO`-PH>K`_tQ%9KUaH^#ZVtJSlq>ZwotR;s1 zWiFaH8Ft8imiUS($esg~$dkDt;`1flNcKuH#}Vg~$_dO7zX~iDVHI9DjPz|loRN!6+m*P-G}`8tuyj3y&fLUtlSVqQY0E!$nKV`~yC~&h9NMRj_{|5TGu!9!3nF8PP1#YIm0*qZ;WEDVP z`4v@`<$4iM10`2xlJH$cAo6a+c`R~?vhFri>3RHD*kUh~uv0jIN87}X>h+%6am$(R zcGID-yiUq(pk*c$u#EL&Nt#PuBB@h9BBl%OY_ps2vmfxYh;m8JMl!Q0*OL7TNme|1 zA$ykGK->mNc&^5A@y@%2=vG!ESBQKHG(nZZ{7k9XG8D)M$$E<g8!e;LEmq0$D#c}9rRtQHmo{X zK7?|a%EN{iQkM++7&Zjcke5&U#OIk6S!%#$ORjzJWj1~{B8>D~P;uCXH6re()iPY(XDxUL*%pYs2~j?f zhoa-Y2NX8IkV)dbAlyxr9#MpgND$*G@+1!2IJ_K*BXAeic#NxffJNXQ?RE|W?`mKR zXin+*paAnQllQnpJ@J*Je1lCrU(y;e#49288<3WHP~n;VBv6^OlsumU_*N>F6`FzH z?B|F*=P6_}T;4&>3O$2-j-m~acJ99`8t*LUu(0Subkw%d8x^0UI4>MV8~+JC`hKIr z)tBL^{+~W8Pr~q$e=FIjO^AJ{Cqs@Q@={5}-H7{u%-o3|d6Di)-kKIWppGLpKz~oi z3sK4s=-CL0e(=f9oAJE+10gw`I?R-;|1rdVR3DOMM9z~$Jd3FA!Q2RQIO6Mp9*eUr$d3-dZLn{F&& z{7)QAQkTTV%TF-2T%lqvjD~9|rL{;<>6zyTr?UKbR5NlENY*-;jO(NTw z?FA}VO(NSlYuo`4ck!u1zWg{#-!EBm4I<{LG4g8S9#*3sJSqTRAWMn=zQU8Y3GpGw z%DkWW^LL`A43{_h$I>yxHbh6HQ&?>T8yX%CkyFo#fBAZN;P%LK=GM5PFVluDe{fpeSl=2*2I?VelbJCG= zF*x&;4@rl4F-C2w@_tBV7J*@d&#*`{gO)6MO4O^wU5g~a!ov*HsTP53+e-o?o@_$B8$~MI_w!RBjf~pL3CTHFfRxvLm z<*8uPjhYuyjmkTZr12S2Ug(p?XJ}F(Nxw&_RX*wWUa9+(y`Xc4PkPR4&QzBA4M?By zNx$((H;}X!q=$UcUXRpC(p9dMPx_>*T&>2lB(*_}gFdOvQ)3P7b061$6pdr8D5ht$V_s|59AdTkX5y+Fu% zcjB)Be*%PwFC){%%s(T;`G0aBSWfv5K%6iUrf@J&=t~sr$|)Q-%=Z({lv6mwn9nZ+ zoFgYy17?0Q;e2@vicFyqiVbdsBPP*<$WTS55;+#OocKI&&#=--bRtq7BlTp-TLcq% zEBxO`of1Nhl*6P>k(20G%nNjkJWXCVS(AAtY|XeG0Zr?6sQbMDhow8b5*9BeRB4+>>{*$)CSmEo5rHub_2$uHa04A zygVzPy5jPiaCVW*%VUd)%NgUhYA$Ne1uetS@=PQ1RU@Iw7|$pfXXP&{(q_RmvTAh( zMUS=V+61g59PqHMg`Oo*gy1*}gbGCgI2qJpW8m?$BxS;qQ01fy&vFwWJR2%|(n?U= z0w+dA&@D zpymK%pLkTf#h^ViZ@f4Qt3kfs+`O~$m3dIcZk9i6KY-VdCM(l7G%7G-lZK|+-r#2| zvQt};WAx0mg_`mwP|=!$Y;Em34pU+|x3nBAHa%s9c6X=Vq@P0%o7&+O4#NH_6%LpRKtQMFr8`MkhZ z?6dsTKEs4+WT1Jr$ygQ(A*Ne2Je)c$7ZQ(|NRc75$X3vFI0Y03;wff4XGqLNW{w)w zY5$WR5wz4Yo*HAm`BIh0nRDDc@LwJ%Xnt$GM)v{n{c_R zXPbpQ$2ck`4K+-#zC^e!3D#{rA#qf3D5_O`j4@e3z-9*cSoDUs-0F4S2MPmbJu7ki zV1yaD96v?2xiuHYn2ikjV7xshgF%9QfEn-{Booqye90*o+TI2X+lGl|h)=Q@GpO3h z)|3Fo$$F=THD7Pgrce&6)!UC#Q@t?at;G}3osNJs+|_uiU<@v!CH4fkV&EUIV;tPA z8HM;Ezu57SzBnR;_a+t^-o3da*%fVq84xlYzAEF+k#2c(iMuq)q}AOVz0@se+*2Am zw=`B-TD4=zlI2w^s+PJBZrz5PwQ`nQw%93#Vee7a{OV|?{*bNdy)K29rbc^XDtJvs z2>(49=*sr;*F9gBB2<++1!x73aUx$Az{cFuqNQb}rL(L*HykZ3bx*<1sKG5H#m({P zWwcpoX?d*F9T!Eu+>J%ulK*c)XS)ST>TJ{jJyi^T+@fe10^SReau98GMD!!@^$*-T zAElQF(b!Vg)r2?ejvo|!-NyZPhC~m#ZPDd1di{F-ESlwR{DGSrbvH)Y518(h|L_GH z_nRTvx@1||x$KmgrQ0`@&V)P7ES(vPm2R(^F>6WL%(7Bdr{O~7@gI!#GQ@;QB2gT9z3rT?kld0!rRU*bFYoIl(~;= zm8I@4MPu{&m)l?vqkZTEE1g_>9bbS<2|& z`prx(UsASo`^-{PZy#CS!rjPaOPYGiXSlz2qL-JQ+lpqYmcrrDHa0Q_hj-U(b8r82 zqbbXmCfuJna>Dv02rvpXG*$Bz3HNSCx)Y?^9Car|J(k#tsu>e@7#s1;2=_l6S=jwrB_~hQPQG*CK93u5 zm~aiQmbgEs;`lm%`xPl;K36X>-<1*$woD`Wa+{+b{rr{ne>dKr?i|%3d}+YFL>8Bw zyCfE?a_2U>OBS1<#5V-oUkF*;ggM37hOY>?uL*e)hSuYyX3W6lh5Ig8ml!_21mNBx zWqG+0*QiYM;9uX+@LqSeCS`AI@F6}OV^X#I$td1JcgIGT#H#%E@$o%d94$YmoFgYw zW@02Ywt(5qTYRqjdA)gY2Sp>v?p<4>?wCgRpoqE;A^Wn3&Ni&~Yt~P<8f)^YyL*q6 zv)!`$-Ok0B`peuEjZ59>jqcS^_w=a#EpxBlR(5XLx!4f6ozb$YrE}E&g6~Y?t~h@` z;z{Tu-hbVk}oT`+ohayxxbq54FvaoDT~&dbpwtf+=qejXIj2>;C^4?YDw{YM>*6je-#c@ z-`)}U6JJVj&yy!Pj^07>g#`CUSSb}^iMl-cZ$}cF>OGsK-x;8}j=I=w;6lcD1D`K* zk5#-LmpK8NkC)wN;3Tm!vu5(?GA}ENeNW=EW%pI=*ea{sFF9C!7rWoZ%8N^#aFlE2 z0~(kdomF1yKK1FvP3}S0nJ-tkn-;r~#cfNQmhN=-ZpE_uWx05%d+V0QWxdtz5qF#W z`7KeT(evEfkom2$I|^rDZ$as~5Yqi@Cs;RhO2YeV%*8Vz+neV)x;U z#ZN7DCvR(BwzRDI=BM1-w%(7uC@!q{`^o51TxFNJZ;D3utRIvubtf)%zW`nG7B^q6 zt_&CRw^Lu8wY0abkMy*4HLq_=Hbi)y>chUmXlifY&;@VrYHIK7POVy_s00u2EQrjG zo`(ZDzIOFZb)BL$(Uojb_k})mO}(2>9W5=1hUSepSJc@h*0ppepy1pdlbcoEBN`L+ z_3fgAnkDL?{iVD@U!Cl1Zrr?}DOtavtEW}5W8G-c#LJT1E0guz?VTFDqO-X>nZk-X z%FgQ%U5Y8u)%?k%XsE**Igs3qdQ{PME$#IiL~~t7qBGgm)6(s6FKXDNYO8B#=+rk0 zs_Hhk_jqcls^+VbO3j6xI7IoOn^GSWeBb+CrRLs-QmvxBEvfCJl+*_665WcZny{#? zv0bp8$u5KU%xVnB(`H)6qPAvO2!3AI-P4&&)SHe`(v(%yx*o{wSX9?hS=ZLklI&DQ z#>&+SP}KKyb|%}p6YF5Ogfg-cvGUsH?)oOnvaC>p>u7GJYh!a~(0`teZSW2yVO~Q+ zO}j3EPBm43*yHg%yQaR52Voa<^ej!bE@_env)l15)k&$S7w+nl@}d(x$el+YcY93g(Kx zhFAV8lii}RGnq_u_O!J%x2;dqxA(MlCp#0Il|*ZEOG`6+y1lKz5QHk8*jU%nlN3tC zst!zJUS9W#LaXi=RdieXwYnsxOs@G0y4zQ5s!F!4?`~2vB4*=;_^%wJW6lu7YX3VMc)D`Wen(Z$>n*Hl(uBB>CHy4UL{QDPI z$5ak`&WEE^;DS|kumRMvEO@k7qmikp>)P;_*Hd3~{-ym+U#~4_*E1&5t_AIFZPe10PpsTOAswQ_S?eG~Jl z+qAU#JSS937Ee}1M#w^A@bWZQG*kz-F`lj=&*qmcSa4xvIxdXP_O6TO z;dNwDm#kaYEF>PsA>eke7(u{m##;(-ZxY|vQ-Kf5L%8)6!t*{HQ|7&><9P9H7%>Bp z&k$>oYToc|@&;$8yCbB&uR%JW86NfNlW&tZJ2$yEhHl8%nYkk?#J6S(E;h3GlyC=m zsaQe&ZE~lx1FDFrh?K?Wg3ln;b*0Gyp2f(=r+*QoMlK)ybpSq*j(qNy?YB2gt}b-3 zkQy5R;mzvzvgIb!&&OhM@+w(@Eh&q1J{zkb z9X2(x42_S-ScOfa&guQz4>^1smCj2!r181biD-O2bs`#{Q=N#$CsvgIUb<1&Ex1?3 z2Sc>4f%z~fV!`UDs0|~}dMTgf`TU3d{(g1wJJNjA5(jStkuaaF>_c9cExAqJN8l}g`mgTO(Z>>X-vnOX<7V4+{n@wS42x8B)|huD%=bB z0mSj5Tev)ma{6vrIkj?HK0j7GWe-V@7;@q`ausB=7FGIqvR8*<*`$>bOgR}tG1^xJ zir9gO5AHD`8Q+ylr`l?hg{ELrnfB}aWTu?Hfv3l)K;A=$kj{i;DR?GOg~LGcxCp2Q zMUDenh)Ox%Lm<0D1=3&9MVS0aWowuSa8eMGY?ZCycT{HUtXEnopo=eOLg`YhGE|mj zp)`~y&T#o3U#Bne=Nc z69G}+Wy15skidi$5bFiX?^b1&GkHK|{g#rtNugFSc}!*fUMICip;nS|NM+X;$t?hN zfh(9OHN>^OTYSHM#KT%mFuwbNtFFehZ@ICq!Ac(p0~tT-s+N z(jS@j>AdgZq%S~(otThp*(snd52(H}0d++{^{rS7QMVvwVE|t+?SiSk1z5)eh*XK` z*K~d|Q|=ys_lF31zk>+%n7pL2eiZ?AIjJuys;}N&fR8IwH4}=qnnqDY3RTTSQ+>(( zsZ{m#n82e+)hOT229+uD`7tEFv6TB5qAPMmgc+WeMr)WHLd?d-D|d1v^K`!iH%xy* zq>>1fm1s$2>Yy?vp_Goq+WHh|tR}qEX9j)FX;( zg+cB03;JC9d{i~dvnp%KBzP2&jbqAPnXPFF;Hii(BkG9zMj_v9&8yP5&igGST;b7~ za+hYyC0ygtnbwX%zXCYR0xY6Ye%k_+ZvhHw(85&Oq4U0Cq_0P`1P3TzFiUmok}B=h zd0z_Q9Uh%2H-UEZxT)g-Vw#mHH*Pka8@IbXI#a&L0y@`n6-fUYBD7>evK0QDM(V?g z>MP7$RU$M_$3G0*QN%H# zM{xOfFUNtyV6aefv6ik}aV%1U zD8-63NIG=Z_yG^{Rv=o<;_2Nr8dZx#9pnuZ_D|~us7jb+2_lq;SV|CGg@|_WtE|5N ztG%@&_~{Yd4s-9p=rk1>eCtCRI`MN6IW|Mj(8GO%^&yZoNLL)*^()zNT!?${do(pE`KVfCtcoLANPYV0=l^#W|rm6^)F!t zt?xQaF}ggb&N%R#^!6d;T(uXe3EZRN8#nNE&Cls%sv#m}-VvMN%bL!)h4$KnG=kIw z%{Lh;X+F*&l+C%qZeIm(cz4<7<6OZub55WP4rKCk%oihNU^~rqqC((D*H;P`)Aez5 zGuPs!hELn`yFOnB=n)WiA)SuYTmv2e%=$R$dCg}6Ke5`2$m_W{Dlk`KAC#`H6}5`0 z2(MF3*}2HX5nJr~z)K%yqz^OFhZ*U^jPzkf`Yczc zB9~wjvXRe6CNNK*W~A?$z&w4J zk-lmI^YmFp`Ya=TmXW?{?7%#I(*)+}qm1-L6Zol#e8dvO$%rO!2Jc4Pgt!H92jVS= zCcGb=pGc@cG!wEZ$GSNN7&!(Q4|tJdfRRg{AEI5G@yVBUBHGp6snaHt+o;|*=}Pb+ zd(;C&w3#ndM7xul@Y~t0-cE_G!$Z|*Q?jmuV(>K0OA^hU*O+W$GqMfIbv^6x=oSx8 zynNldb)CtL22zhHJqolC(R#dmftM~s6dwbQ)^&GxHm}3u7F4DsHA1zd0r0kk$=2a9 z)B1qTgZwtXPv&IMG2Db2zK)3Vf8cSxF@Zk7FddP33}F>|@yoGqf|(x5fG~Wd??s$z z%?+m8`H?a5Vd$%GLLUXsQS_GyM&8GOARiV<)tCL~&%H!=!SF2vY}#?L*A9Lz(FBuS zZ1M5`jH&>nXqsMg~)>8gZx-{(2IQ+yc)rz;>|x zT+VEH6@RC{+5@x-MxKFFQusAtH$`*8x@L|y2G^^B>$Zlq70q1e3Tk_zJcb4+YzvLw?)i z2wM)V_<6=S2rhO-sdjZ#e?)v1d=&`!sTLeVe!2x$AV0%``B@(F=->!+x4+k;C$PR? z*y550@NCVDU(Fw}V7P($f1w(sdpPdXUGYWa`9Byn>e$Gak-5py5H0XcWDi&{KRrI% zZ?r3(23%vo&swm9@;?XMWYG@-Zn5BDz}1%gqkuas_{}t!_V|NECmh(XNZBXYGornI zT^uXN@O)RV3rG+`%D%PQjTOx69{Mv;I47*=ftM8G+uJOsgOSJUD}y-=bi%bj&>N^9 zzdfx34)!6#{i}ib#Y4hux8dLC&r_P8`&`2x2fw*~GyHM0c%nYa=YH7mF9*V0=NbNd zJq*F3`MGa4{L~lY)rTpM`)M6?d+xSi(z(yJ=?|Dm&Xdpmx1p1t`)~uZz8XF3k<sgO*pD2JpSY#Q7CTr^Fe*VwTtJkR(Z1bTQKFlZNW;Mzg~Lnw_wtFy`zJsSEs=h{IHk` znc@p5K$t_s^cVcsr~d=!gl+mQ=vy5M#Xl;AG-T`Hae4wbzn29_4odw(YmuqMr>qVVl0z-&hoikBw4)aIL88>$d7=yLjEGgQoAc z;7Z858}-@kC#?DPc)iK0pI;g@!Sru%O{&KSuSa#z^&POvuN|d)aP6x3L;kiw%j0#d zEpNI7Q*U118aiQK=Ng#(S7X7X^SW1ukXQ$O_~}-={e(3=Q(Ox=zduWa@h|l~TE(F4 zQ^L+t0rLs?O)&NeuCaA{czvydZtq^JJpcKH38s99#n1m=KsW*>N9gjmSah~ymj$!^ zk6AG3yq?xUmw(oRNk3r0EZ=Xzr1Sb)2VK5qTmU}={rLGpE-_|3IB40E|DJ_#m7;6= z@$tJ3h3X%a7>MoXcTY_qOnuCLmv?pv^ZzL8pkejD7Zt+WKR_Qt{|V&L-?+w%gZ+L6 znCokY2Ok7%oq@~zW}!Fxh{o%Y-DE|{Vu><&m*4vFB6^; z^zZj{d5Ty1{v@sZOMp4Q@*0Ht4FERJ2MGTGFy9ShV1K&)UX=3ia1U_MUs)mocm~>Q z26#uhwrC;Gq6vBbNc@d}rFX8gLx;r!8o&s{wQW9r55M)TP0@%?Z4_V%7A77jZ+7}XsSY8OfeSA01=08bK zq>731rl-*J#QACP62P`UCIB0K!_ap<`ThRQ6`umk{aG9}&>lMg+xEL1aIIypdkFjE zD?@w(aNtkJM!p9ap_e~lA;mue=6b>B7L@->z~(s?;UU20eg@n324K7WS=ighDGY)7 zkJo$sUJV}`nFcs$&#{q<6}?|Q$Dq8cNw@s7LznM2&5n*Yq55F*P*S8b! z>yD;#Jo3}@M=kh1z_z~M2F(2!hb-&=0bpJq8v8vB7@?OxZ2uv`WJVx-46tp_477#U zho*c1U|x?_fS>YD2aM3mAC{k!0!wjO3Vdv217KdSSAw7Aw*t2PcXt~9H%PbUmnTx- zJn=Ka{&+t&awM(%I~w-=p%`n6E$_@U_+x+(eE!9N&HW{g&t;n4OD49rA%$O>YZ1Tv z4WM&BZtQm_;9$PZ5q}TZp3k1p@+e-(e-W@feg^>8`r`{b#uWJ2NG9qs&xvW@V!*cl z%>*3Oe{AF;z~(tN`MI~U?Xw&(g5REcz_z~Ek>8(xvc+wH?fM=7Y@VZ2{x<;&Ykm9) z;GjLnMh*hD{qHyA_v@F~IMxXq6G?U_n)LZ!bp25@J_QPR$j44EM2&C>AY&uivNq*xf#bSaU|EvLtP##!ePwz z_70uHK@)+;a5w>-+|=By35kTlln18Phh)q&L1Q zaZXr#4j6eT3l#j~IFNmu3CQ655CCOA^K}L9;I?;cPxY5R`{m1WkqXe@iQa z?%G)I7fB?{lW66`5Dp0bmhXtq7};mTe)K1Qop{QuB35GyR)ZG`u64BC>Vn)rNljhB@Q5EYK6Fg66 zAE_Rw`x&##(Z#Cr~2UD}fZOPaEY#ON(IP2kHD zz6iWdVHr`k#p^M{pJIog5@m2Yg5k6L#-Jemxb9C8m(m;aD(5Gv@lBJCretSb3-t2F zvyoepu z;o@kUbM$@)_ya*kbWri7i}W0z%sg6=02jD^fKxf>juZ{%%x7r+_XRxn*Hy!G`a>0o zgy+zPKarr17zOo+HZ*^B_D`rP)2lCCBu1GWwKkk^wLCSSUW!j>@JKDRHU4L6)BJvS z8T5%9#i*4?C?8Lm4OUl=?p#5cVATq6zLQ(B=yZHBDSal_+9?AVQ~Je?L~p$7p<wb^{ewU0$J7IFY@K(w>*3 zNpAMnL!-TML3Vl?vmP!+pekxgv8|p@c?b19Z?%=CU#5vn-3S=bkcvT2x6WH2OeNNS zSkTA3t++Mfm2@oyOOon!|64ECG@Dwh5uZp@E}U1b7Ie-cflC?&^q$@^LFUTzPtE9+ zG;Jz2G>Uy`S=cB= z5yw}Q!l>32&BN;sSl6l~y=GREjx&9l@~sJ@0DU1SU^}`|%d7}#hEgtUc=Q+#RLLC4A diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/bin/openbtl_olimex_lpc_l2294_20mhz.map b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/bin/openbtl_olimex_lpc_l2294_20mhz.map index 47af06a5..80493108 100644 --- a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/bin/openbtl_olimex_lpc_l2294_20mhz.map +++ b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/bin/openbtl_olimex_lpc_l2294_20mhz.map @@ -7,6 +7,9 @@ Discarded input sections .text 0x00000000 0x0 ARM Flash Debug/../../obj/main.o .data 0x00000000 0x0 ARM Flash Debug/../../obj/main.o .bss 0x00000000 0x0 ARM Flash Debug/../../obj/main.o + .text 0x00000000 0x0 ARM Flash Debug/../../obj/extflash.o + .data 0x00000000 0x0 ARM Flash Debug/../../obj/extflash.o + .bss 0x00000000 0x0 ARM Flash Debug/../../obj/extflash.o .text 0x00000000 0x0 ARM Flash Debug/../../obj/cstart.o .data 0x00000000 0x0 ARM Flash Debug/../../obj/cstart.o .bss 0x00000000 0x0 ARM Flash Debug/../../obj/cstart.o @@ -32,8 +35,6 @@ Discarded input sections .text 0x00000000 0x0 ARM Flash Debug/../../obj/timer.o .data 0x00000000 0x0 ARM Flash Debug/../../obj/timer.o .bss 0x00000000 0x0 ARM Flash Debug/../../obj/timer.o - .text.TimerSet - 0x00000000 0x10 ARM Flash Debug/../../obj/timer.o .text 0x00000000 0x0 ARM Flash Debug/../../obj/uart.o .data 0x00000000 0x0 ARM Flash Debug/../../obj/uart.o .bss 0x00000000 0x0 ARM Flash Debug/../../obj/uart.o @@ -179,131 +180,141 @@ Linker script and memory map 0x00000001 . = ASSERT (((__init_end__ >= __FLASH_segment_start__) && (__init_end__ <= (__FLASH_segment_start__ + 0x40000))), error: .init is too large to fit in FLASH memory segment) 0x00000370 __text_load_start__ = ALIGN (__init_end__, 0x4) -.text 0x00000370 0xef0 +.text 0x00000370 0x110c 0x00000370 __text_start__ = . *(.text .text.* .glue_7t .glue_7 .gnu.linkonce.t.* .gcc_except_table) .glue_7 0x00000000 0x0 linker stubs .glue_7t 0x00000000 0x0 linker stubs - .text.startup.main - 0x00000370 0x104 ARM Flash Debug/../../obj/main.o + .text.main 0x00000370 0x98 ARM Flash Debug/../../obj/main.o 0x00000370 main .text.FlashGetSector - 0x00000474 0x60 ARM Flash Debug/../../obj/flash.o + 0x00000408 0x64 ARM Flash Debug/../../obj/flash.o .text.FlashWriteBlock - 0x000004d4 0xf0 ARM Flash Debug/../../obj/flash.o + 0x0000046c 0x110 ARM Flash Debug/../../obj/flash.o + .text.FlashInitBlock + 0x0000057c 0x38 ARM Flash Debug/../../obj/flash.o .text.FlashSwitchBlock - 0x000005c4 0x84 ARM Flash Debug/../../obj/flash.o + 0x000005b4 0x6c ARM Flash Debug/../../obj/flash.o .text.FlashAddToBlock - 0x00000648 0xc8 ARM Flash Debug/../../obj/flash.o + 0x00000620 0xdc ARM Flash Debug/../../obj/flash.o .text.FlashInit - 0x00000710 0x20 ARM Flash Debug/../../obj/flash.o - 0x00000710 FlashInit + 0x000006fc 0x20 ARM Flash Debug/../../obj/flash.o + 0x000006fc FlashInit .text.FlashWrite - 0x00000730 0x70 ARM Flash Debug/../../obj/flash.o - 0x00000730 FlashWrite + 0x0000071c 0x6c ARM Flash Debug/../../obj/flash.o + 0x0000071c FlashWrite .text.FlashErase - 0x000007a0 0x108 ARM Flash Debug/../../obj/flash.o - 0x000007a0 FlashErase + 0x00000788 0x130 ARM Flash Debug/../../obj/flash.o + 0x00000788 FlashErase .text.FlashVerifyChecksum - 0x000008a8 0x48 ARM Flash Debug/../../obj/flash.o - 0x000008a8 FlashVerifyChecksum + 0x000008b8 0x48 ARM Flash Debug/../../obj/flash.o + 0x000008b8 FlashVerifyChecksum .text.FlashWriteChecksum - 0x000008f0 0x6c ARM Flash Debug/../../obj/flash.o - 0x000008f0 FlashWriteChecksum + 0x00000900 0x74 ARM Flash Debug/../../obj/flash.o + 0x00000900 FlashWriteChecksum .text.FlashDone - 0x0000095c 0x50 ARM Flash Debug/../../obj/flash.o - 0x0000095c FlashDone + 0x00000974 0x5c ARM Flash Debug/../../obj/flash.o + 0x00000974 FlashDone .text.CpuMemCopy - 0x000009ac 0x40 ARM Flash Debug/../../obj/cpu.o - 0x000009ac CpuMemCopy + 0x000009d0 0x44 ARM Flash Debug/../../obj/cpu.o + 0x000009d0 CpuMemCopy .text.CpuStartUserProgram - 0x000009ec 0x44 ARM Flash Debug/../../obj/cpu.o - 0x000009ec CpuStartUserProgram + 0x00000a14 0x44 ARM Flash Debug/../../obj/cpu.o + 0x00000a14 CpuStartUserProgram .text.CpuReset - 0x00000a30 0x10 ARM Flash Debug/../../obj/cpu.o - 0x00000a30 CpuReset - .text.NvmInit 0x00000a40 0x10 ARM Flash Debug/../../obj/nvm.o - 0x00000a40 NvmInit + 0x00000a58 0x10 ARM Flash Debug/../../obj/cpu.o + 0x00000a58 CpuReset + .text.NvmInit 0x00000a68 0x10 ARM Flash Debug/../../obj/nvm.o + 0x00000a68 NvmInit .text.NvmWrite - 0x00000a50 0x10 ARM Flash Debug/../../obj/nvm.o - 0x00000a50 NvmWrite + 0x00000a78 0x10 ARM Flash Debug/../../obj/nvm.o + 0x00000a78 NvmWrite .text.NvmErase - 0x00000a60 0x10 ARM Flash Debug/../../obj/nvm.o - 0x00000a60 NvmErase + 0x00000a88 0x10 ARM Flash Debug/../../obj/nvm.o + 0x00000a88 NvmErase .text.NvmVerifyChecksum - 0x00000a70 0x10 ARM Flash Debug/../../obj/nvm.o - 0x00000a70 NvmVerifyChecksum - .text.NvmDone 0x00000a80 0x18 ARM Flash Debug/../../obj/nvm.o - 0x00000a80 NvmDone - .text.TimerInit - 0x00000a98 0x48 ARM Flash Debug/../../obj/timer.o - 0x00000a98 TimerInit + 0x00000a98 0x10 ARM Flash Debug/../../obj/nvm.o + 0x00000a98 NvmVerifyChecksum + .text.NvmDone 0x00000aa8 0x1c ARM Flash Debug/../../obj/nvm.o + 0x00000aa8 NvmDone .text.TimerReset - 0x00000ae0 0x20 ARM Flash Debug/../../obj/timer.o - 0x00000ae0 TimerReset + 0x00000ac4 0x20 ARM Flash Debug/../../obj/timer.o + 0x00000ac4 TimerReset .text.TimerUpdate - 0x00000b00 0x38 ARM Flash Debug/../../obj/timer.o - 0x00000b00 TimerUpdate + 0x00000ae4 0x38 ARM Flash Debug/../../obj/timer.o + 0x00000ae4 TimerUpdate + .text.TimerSet + 0x00000b1c 0x10 ARM Flash Debug/../../obj/timer.o + 0x00000b1c TimerSet + .text.TimerInit + 0x00000b2c 0x48 ARM Flash Debug/../../obj/timer.o + 0x00000b2c TimerInit .text.TimerGet - 0x00000b38 0x1c ARM Flash Debug/../../obj/timer.o - 0x00000b38 TimerGet + 0x00000b74 0x1c ARM Flash Debug/../../obj/timer.o + 0x00000b74 TimerGet + .text.UartReceiveByte + 0x00000b90 0x28 ARM Flash Debug/../../obj/uart.o + .text.UartTransmitByte + 0x00000bb8 0x54 ARM Flash Debug/../../obj/uart.o .text.UartInit - 0x00000b54 0x40 ARM Flash Debug/../../obj/uart.o - 0x00000b54 UartInit + 0x00000c0c 0x40 ARM Flash Debug/../../obj/uart.o + 0x00000c0c UartInit .text.UartTransmitPacket - 0x00000b94 0xc0 ARM Flash Debug/../../obj/uart.o - 0x00000b94 UartTransmitPacket + 0x00000c4c 0x84 ARM Flash Debug/../../obj/uart.o + 0x00000c4c UartTransmitPacket .text.UartReceivePacket - 0x00000c54 0xb8 ARM Flash Debug/../../obj/uart.o - 0x00000c54 UartReceivePacket + 0x00000cd0 0xc0 ARM Flash Debug/../../obj/uart.o + 0x00000cd0 UartReceivePacket .text.AssertFailure - 0x00000d0c 0x24 ARM Flash Debug/../../obj/assert.o - 0x00000d0c AssertFailure + 0x00000d90 0x24 ARM Flash Debug/../../obj/assert.o + 0x00000d90 AssertFailure .text.BackDoorCheck - 0x00000d30 0x48 ARM Flash Debug/../../obj/backdoor.o - 0x00000d30 BackDoorCheck + 0x00000db4 0x4c ARM Flash Debug/../../obj/backdoor.o + 0x00000db4 BackDoorCheck .text.BackDoorInit - 0x00000d78 0x20 ARM Flash Debug/../../obj/backdoor.o - 0x00000d78 BackDoorInit + 0x00000e00 0x24 ARM Flash Debug/../../obj/backdoor.o + 0x00000e00 BackDoorInit .text.BootInit - 0x00000d98 0x1c ARM Flash Debug/../../obj/boot.o - 0x00000d98 BootInit + 0x00000e24 0x1c ARM Flash Debug/../../obj/boot.o + 0x00000e24 BootInit .text.BootTask - 0x00000db4 0x18 ARM Flash Debug/../../obj/boot.o - 0x00000db4 BootTask - .text.ComInit 0x00000dcc 0x3c ARM Flash Debug/../../obj/com.o - 0x00000dcc ComInit - .text.ComTask 0x00000e08 0x24 ARM Flash Debug/../../obj/com.o - 0x00000e08 ComTask + 0x00000e40 0x18 ARM Flash Debug/../../obj/boot.o + 0x00000e40 BootTask + .text.ComInit 0x00000e58 0x44 ARM Flash Debug/../../obj/com.o + 0x00000e58 ComInit + .text.ComTask 0x00000e9c 0x24 ARM Flash Debug/../../obj/com.o + 0x00000e9c ComTask .text.ComTransmitPacket - 0x00000e2c 0x18 ARM Flash Debug/../../obj/com.o - 0x00000e2c ComTransmitPacket + 0x00000ec0 0x18 ARM Flash Debug/../../obj/com.o + 0x00000ec0 ComTransmitPacket .text.ComSetConnectEntryState - 0x00000e44 0x14 ARM Flash Debug/../../obj/com.o - 0x00000e44 ComSetConnectEntryState + 0x00000ed8 0x14 ARM Flash Debug/../../obj/com.o + 0x00000ed8 ComSetConnectEntryState .text.ComIsConnected - 0x00000e58 0x10 ARM Flash Debug/../../obj/com.o - 0x00000e58 ComIsConnected - .text.CopInit 0x00000e68 0x4 ARM Flash Debug/../../obj/cop.o - 0x00000e68 CopInit + 0x00000eec 0x10 ARM Flash Debug/../../obj/com.o + 0x00000eec ComIsConnected + .text.CopInit 0x00000efc 0x4 ARM Flash Debug/../../obj/cop.o + 0x00000efc CopInit .text.CopService - 0x00000e6c 0x4 ARM Flash Debug/../../obj/cop.o - 0x00000e6c CopService + 0x00000f00 0x4 ARM Flash Debug/../../obj/cop.o + 0x00000f00 CopService + .text.XcpProtectResources + 0x00000f04 0x14 ARM Flash Debug/../../obj/xcp.o .text.XcpSetCtoError - 0x00000e70 0x20 ARM Flash Debug/../../obj/xcp.o - .text.XcpInit 0x00000e90 0x28 ARM Flash Debug/../../obj/xcp.o - 0x00000e90 XcpInit + 0x00000f18 0x20 ARM Flash Debug/../../obj/xcp.o + .text.XcpInit 0x00000f38 0x28 ARM Flash Debug/../../obj/xcp.o + 0x00000f38 XcpInit .text.XcpIsConnected - 0x00000eb8 0x18 ARM Flash Debug/../../obj/xcp.o - 0x00000eb8 XcpIsConnected + 0x00000f60 0x18 ARM Flash Debug/../../obj/xcp.o + 0x00000f60 XcpIsConnected .text.XcpPacketTransmitted - 0x00000ed0 0x14 ARM Flash Debug/../../obj/xcp.o - 0x00000ed0 XcpPacketTransmitted + 0x00000f78 0x14 ARM Flash Debug/../../obj/xcp.o + 0x00000f78 XcpPacketTransmitted .text.XcpPacketReceived - 0x00000ee4 0x37c ARM Flash Debug/../../obj/xcp.o - 0x00000ee4 XcpPacketReceived - 0x00001260 __text_end__ = (__text_start__ + SIZEOF (.text)) - 0x00001260 __text_load_end__ = __text_end__ + 0x00000f8c 0x4f0 ARM Flash Debug/../../obj/xcp.o + 0x00000f8c XcpPacketReceived + 0x0000147c __text_end__ = (__text_start__ + SIZEOF (.text)) + 0x0000147c __text_load_end__ = __text_end__ .vfp11_veneer 0x00000000 0x0 .vfp11_veneer 0x00000000 0x0 linker stubs @@ -311,50 +322,45 @@ Linker script and memory map .v4_bx 0x00000000 0x0 .v4_bx 0x00000000 0x0 linker stubs 0x00000001 . = ASSERT (((__text_end__ >= __FLASH_segment_start__) && (__text_end__ <= (__FLASH_segment_start__ + 0x40000))), error: .text is too large to fit in FLASH memory segment) - 0x00001260 __dtors_load_start__ = ALIGN (__text_end__, 0x4) + 0x0000147c __dtors_load_start__ = ALIGN (__text_end__, 0x4) -.dtors 0x00001260 0x0 - 0x00001260 __dtors_start__ = . +.dtors 0x0000147c 0x0 + 0x0000147c __dtors_start__ = . *(SORT(.dtors.*)) *(.dtors) - 0x00001260 __dtors_end__ = (__dtors_start__ + SIZEOF (.dtors)) - 0x00001260 __dtors_load_end__ = __dtors_end__ + 0x0000147c __dtors_end__ = (__dtors_start__ + SIZEOF (.dtors)) + 0x0000147c __dtors_load_end__ = __dtors_end__ 0x00000001 . = ASSERT (((__dtors_end__ >= __FLASH_segment_start__) && (__dtors_end__ <= (__FLASH_segment_start__ + 0x40000))), error: .dtors is too large to fit in FLASH memory segment) - 0x00001260 __ctors_load_start__ = ALIGN (__dtors_end__, 0x4) + 0x0000147c __ctors_load_start__ = ALIGN (__dtors_end__, 0x4) -.ctors 0x00001260 0x0 - 0x00001260 __ctors_start__ = . +.ctors 0x0000147c 0x0 + 0x0000147c __ctors_start__ = . *(SORT(.ctors.*)) *(.ctors) - 0x00001260 __ctors_end__ = (__ctors_start__ + SIZEOF (.ctors)) - 0x00001260 __ctors_load_end__ = __ctors_end__ + 0x0000147c __ctors_end__ = (__ctors_start__ + SIZEOF (.ctors)) + 0x0000147c __ctors_load_end__ = __ctors_end__ 0x00000001 . = ASSERT (((__ctors_end__ >= __FLASH_segment_start__) && (__ctors_end__ <= (__FLASH_segment_start__ + 0x40000))), error: .ctors is too large to fit in FLASH memory segment) - 0x00001260 __rodata_load_start__ = ALIGN (__ctors_end__, 0x4) + 0x0000147c __rodata_load_start__ = ALIGN (__ctors_end__, 0x4) -.rodata 0x00001260 0x1b8 - 0x00001260 __rodata_start__ = . +.rodata 0x0000147c 0x14c + 0x0000147c __rodata_start__ = . *(.rodata .rodata.* .gnu.linkonce.r.*) - .rodata.pll_dividers.850 - 0x00001260 0x4 ARM Flash Debug/../../obj/main.o - .rodata.str1.1 - 0x00001264 0x67 ARM Flash Debug/../../obj/main.o - *fill* 0x000012cb 0x1 00 .rodata.flashLayout - 0x000012cc 0xc0 ARM Flash Debug/../../obj/flash.o - .rodata.str1.1 - 0x0000138c 0x84 ARM Flash Debug/../../obj/uart.o + 0x0000147c 0xc0 ARM Flash Debug/../../obj/flash.o + .rodata.str1.4 + 0x0000153c 0x84 ARM Flash Debug/../../obj/uart.o .rodata.xcpStationId - 0x00001410 0x8 ARM Flash Debug/../../obj/xcp.o - 0x00001418 __rodata_end__ = (__rodata_start__ + SIZEOF (.rodata)) - 0x00001418 __rodata_load_end__ = __rodata_end__ + 0x000015c0 0x8 ARM Flash Debug/../../obj/xcp.o + 0x000015c8 __rodata_end__ = (__rodata_start__ + SIZEOF (.rodata)) + 0x000015c8 __rodata_load_end__ = __rodata_end__ 0x00000001 . = ASSERT (((__rodata_end__ >= __FLASH_segment_start__) && (__rodata_end__ <= (__FLASH_segment_start__ + 0x40000))), error: .rodata is too large to fit in FLASH memory segment) - 0x00001418 __data_load_start__ = ALIGN (__rodata_end__, 0x4) + 0x000015c8 __data_load_start__ = ALIGN (__rodata_end__, 0x4) -.data 0x4000023c 0x0 load address 0x00001418 +.data 0x4000023c 0x0 load address 0x000015c8 0x4000023c __data_start__ = . *(.data .data.* .gnu.linkonce.d.*) 0x4000023c __data_end__ = (__data_start__ + SIZEOF (.data)) - 0x00001418 __data_load_end__ = (__data_load_start__ + SIZEOF (.data)) + 0x000015c8 __data_load_end__ = (__data_load_start__ + SIZEOF (.data)) 0x00000001 . = ASSERT ((((__data_load_start__ + SIZEOF (.data)) >= __FLASH_segment_start__) && ((__data_load_start__ + SIZEOF (.data)) <= (__FLASH_segment_start__ + 0x40000))), error: .data is too large to fit in FLASH memory segment) .data_run 0x4000023c 0x0 @@ -365,7 +371,7 @@ Linker script and memory map 0x00000001 . = ASSERT (((__data_run_end__ >= __SRAM_segment_start__) && (__data_run_end__ <= (__SRAM_segment_start__ + 0x4000))), error: .data_run is too large to fit in SRAM memory segment) 0x4000023c __bss_load_start__ = ALIGN (__data_run_end__, 0x4) -.bss 0x4000023c 0x4ec +.bss 0x4000023c 0x4f4 0x4000023c __bss_start__ = . *(.bss .bss.* .gnu.linkonce.b.*) .bss.bootBlockInfo @@ -378,122 +384,124 @@ Linker script and memory map 0x40000648 0x4 ARM Flash Debug/../../obj/timer.o .bss.xcpCtoRxLength.866 0x4000064c 0x1 ARM Flash Debug/../../obj/uart.o + *fill* 0x4000064d 0x3 00 .bss.xcpCtoReqPacket.865 - 0x4000064d 0x41 ARM Flash Debug/../../obj/uart.o + 0x40000650 0x44 ARM Flash Debug/../../obj/uart.o .bss.xcpCtoRxInProgress.867 - 0x4000068e 0x1 ARM Flash Debug/../../obj/uart.o - *fill* 0x4000068f 0x1 00 + 0x40000694 0x1 ARM Flash Debug/../../obj/uart.o + *fill* 0x40000695 0x3 00 .bss.assert_failure_file - 0x40000690 0x4 ARM Flash Debug/../../obj/assert.o + 0x40000698 0x4 ARM Flash Debug/../../obj/assert.o .bss.assert_failure_line - 0x40000694 0x4 ARM Flash Debug/../../obj/assert.o + 0x4000069c 0x4 ARM Flash Debug/../../obj/assert.o .bss.backdoorOpen - 0x40000698 0x1 ARM Flash Debug/../../obj/backdoor.o + 0x400006a0 0x1 ARM Flash Debug/../../obj/backdoor.o .bss.comEntryStateConnect - 0x40000699 0x1 ARM Flash Debug/../../obj/com.o + 0x400006a1 0x1 ARM Flash Debug/../../obj/com.o + *fill* 0x400006a2 0x2 00 .bss.xcpCtoReqPacket.855 - 0x4000069a 0x40 ARM Flash Debug/../../obj/com.o - *fill* 0x400006da 0x2 00 - .bss.xcpInfo 0x400006dc 0x4c ARM Flash Debug/../../obj/xcp.o + 0x400006a4 0x40 ARM Flash Debug/../../obj/com.o + .bss.xcpInfo 0x400006e4 0x4c ARM Flash Debug/../../obj/xcp.o *(COMMON) - 0x40000728 __bss_end__ = (__bss_start__ + SIZEOF (.bss)) - 0x40000728 __bss_load_end__ = __bss_end__ + 0x40000730 __bss_end__ = (__bss_start__ + SIZEOF (.bss)) + 0x40000730 __bss_load_end__ = __bss_end__ 0x00000001 . = ASSERT (((__bss_end__ >= __SRAM_segment_start__) && (__bss_end__ <= (__SRAM_segment_start__ + 0x4000))), error: .bss is too large to fit in SRAM memory segment) - 0x40000728 __non_init_load_start__ = ALIGN (__bss_end__, 0x4) + 0x40000730 __non_init_load_start__ = ALIGN (__bss_end__, 0x4) -.non_init 0x40000728 0x0 - 0x40000728 __non_init_start__ = . +.non_init 0x40000730 0x0 + 0x40000730 __non_init_start__ = . *(.non_init .non_init.*) - 0x40000728 __non_init_end__ = (__non_init_start__ + SIZEOF (.non_init)) - 0x40000728 __non_init_load_end__ = __non_init_end__ + 0x40000730 __non_init_end__ = (__non_init_start__ + SIZEOF (.non_init)) + 0x40000730 __non_init_load_end__ = __non_init_end__ 0x00000001 . = ASSERT (((__non_init_end__ >= __SRAM_segment_start__) && (__non_init_end__ <= (__SRAM_segment_start__ + 0x4000))), error: .non_init is too large to fit in SRAM memory segment) - 0x40000728 __heap_load_start__ = ALIGN (__non_init_end__, 0x4) + 0x40000730 __heap_load_start__ = ALIGN (__non_init_end__, 0x4) -.heap 0x40000728 0x400 - 0x40000728 __heap_start__ = . +.heap 0x40000730 0x400 + 0x40000730 __heap_start__ = . *(.heap .heap.*) - 0x40000b28 . = ALIGN (MAX ((__heap_start__ + __HEAPSIZE__), .), 0x4) - *fill* 0x40000728 0x400 00 - 0x40000b28 __heap_end__ = (__heap_start__ + SIZEOF (.heap)) - 0x40000b28 __heap_load_end__ = __heap_end__ + 0x40000b30 . = ALIGN (MAX ((__heap_start__ + __HEAPSIZE__), .), 0x4) + *fill* 0x40000730 0x400 00 + 0x40000b30 __heap_end__ = (__heap_start__ + SIZEOF (.heap)) + 0x40000b30 __heap_load_end__ = __heap_end__ 0x00000001 . = ASSERT (((__heap_end__ >= __SRAM_segment_start__) && (__heap_end__ <= (__SRAM_segment_start__ + 0x4000))), error: .heap is too large to fit in SRAM memory segment) - 0x40000b28 __stack_load_start__ = ALIGN (__heap_end__, 0x4) + 0x40000b30 __stack_load_start__ = ALIGN (__heap_end__, 0x4) -.stack 0x40000b28 0x400 - 0x40000b28 __stack_start__ = . +.stack 0x40000b30 0x400 + 0x40000b30 __stack_start__ = . *(.stack .stack.*) - 0x40000f28 . = ALIGN (MAX ((__stack_start__ + __STACKSIZE__), .), 0x4) - *fill* 0x40000b28 0x400 00 - 0x40000f28 __stack_end__ = (__stack_start__ + SIZEOF (.stack)) - 0x40000f28 __stack_load_end__ = __stack_end__ + 0x40000f30 . = ALIGN (MAX ((__stack_start__ + __STACKSIZE__), .), 0x4) + *fill* 0x40000b30 0x400 00 + 0x40000f30 __stack_end__ = (__stack_start__ + SIZEOF (.stack)) + 0x40000f30 __stack_load_end__ = __stack_end__ 0x00000001 . = ASSERT (((__stack_end__ >= __SRAM_segment_start__) && (__stack_end__ <= (__SRAM_segment_start__ + 0x4000))), error: .stack is too large to fit in SRAM memory segment) - 0x40000f28 __stack_irq_load_start__ = ALIGN (__stack_end__, 0x4) + 0x40000f30 __stack_irq_load_start__ = ALIGN (__stack_end__, 0x4) -.stack_irq 0x40000f28 0x100 - 0x40000f28 __stack_irq_start__ = . +.stack_irq 0x40000f30 0x100 + 0x40000f30 __stack_irq_start__ = . *(.stack_irq .stack_irq.*) - 0x40001028 . = ALIGN (MAX ((__stack_irq_start__ + __STACKSIZE_IRQ__), .), 0x4) - *fill* 0x40000f28 0x100 00 - 0x40001028 __stack_irq_end__ = (__stack_irq_start__ + SIZEOF (.stack_irq)) - 0x40001028 __stack_irq_load_end__ = __stack_irq_end__ + 0x40001030 . = ALIGN (MAX ((__stack_irq_start__ + __STACKSIZE_IRQ__), .), 0x4) + *fill* 0x40000f30 0x100 00 + 0x40001030 __stack_irq_end__ = (__stack_irq_start__ + SIZEOF (.stack_irq)) + 0x40001030 __stack_irq_load_end__ = __stack_irq_end__ 0x00000001 . = ASSERT (((__stack_irq_end__ >= __SRAM_segment_start__) && (__stack_irq_end__ <= (__SRAM_segment_start__ + 0x4000))), error: .stack_irq is too large to fit in SRAM memory segment) - 0x40001028 __stack_fiq_load_start__ = ALIGN (__stack_irq_end__, 0x4) + 0x40001030 __stack_fiq_load_start__ = ALIGN (__stack_irq_end__, 0x4) -.stack_fiq 0x40001028 0x100 - 0x40001028 __stack_fiq_start__ = . +.stack_fiq 0x40001030 0x100 + 0x40001030 __stack_fiq_start__ = . *(.stack_fiq .stack_fiq.*) - 0x40001128 . = ALIGN (MAX ((__stack_fiq_start__ + __STACKSIZE_FIQ__), .), 0x4) - *fill* 0x40001028 0x100 00 - 0x40001128 __stack_fiq_end__ = (__stack_fiq_start__ + SIZEOF (.stack_fiq)) - 0x40001128 __stack_fiq_load_end__ = __stack_fiq_end__ + 0x40001130 . = ALIGN (MAX ((__stack_fiq_start__ + __STACKSIZE_FIQ__), .), 0x4) + *fill* 0x40001030 0x100 00 + 0x40001130 __stack_fiq_end__ = (__stack_fiq_start__ + SIZEOF (.stack_fiq)) + 0x40001130 __stack_fiq_load_end__ = __stack_fiq_end__ 0x00000001 . = ASSERT (((__stack_fiq_end__ >= __SRAM_segment_start__) && (__stack_fiq_end__ <= (__SRAM_segment_start__ + 0x4000))), error: .stack_fiq is too large to fit in SRAM memory segment) - 0x40001128 __stack_svc_load_start__ = ALIGN (__stack_fiq_end__, 0x4) + 0x40001130 __stack_svc_load_start__ = ALIGN (__stack_fiq_end__, 0x4) -.stack_svc 0x40001128 0x0 - 0x40001128 __stack_svc_start__ = . +.stack_svc 0x40001130 0x0 + 0x40001130 __stack_svc_start__ = . *(.stack_svc .stack_svc.*) - 0x40001128 . = ALIGN (MAX ((__stack_svc_start__ + __STACKSIZE_SVC__), .), 0x4) - 0x40001128 __stack_svc_end__ = (__stack_svc_start__ + SIZEOF (.stack_svc)) - 0x40001128 __stack_svc_load_end__ = __stack_svc_end__ + 0x40001130 . = ALIGN (MAX ((__stack_svc_start__ + __STACKSIZE_SVC__), .), 0x4) + 0x40001130 __stack_svc_end__ = (__stack_svc_start__ + SIZEOF (.stack_svc)) + 0x40001130 __stack_svc_load_end__ = __stack_svc_end__ 0x00000001 . = ASSERT (((__stack_svc_end__ >= __SRAM_segment_start__) && (__stack_svc_end__ <= (__SRAM_segment_start__ + 0x4000))), error: .stack_svc is too large to fit in SRAM memory segment) - 0x40001128 __stack_abt_load_start__ = ALIGN (__stack_svc_end__, 0x4) + 0x40001130 __stack_abt_load_start__ = ALIGN (__stack_svc_end__, 0x4) -.stack_abt 0x40001128 0x0 - 0x40001128 __stack_abt_start__ = . +.stack_abt 0x40001130 0x0 + 0x40001130 __stack_abt_start__ = . *(.stack_abt .stack_abt.*) - 0x40001128 . = ALIGN (MAX ((__stack_abt_start__ + __STACKSIZE_ABT__), .), 0x4) - 0x40001128 __stack_abt_end__ = (__stack_abt_start__ + SIZEOF (.stack_abt)) - 0x40001128 __stack_abt_load_end__ = __stack_abt_end__ + 0x40001130 . = ALIGN (MAX ((__stack_abt_start__ + __STACKSIZE_ABT__), .), 0x4) + 0x40001130 __stack_abt_end__ = (__stack_abt_start__ + SIZEOF (.stack_abt)) + 0x40001130 __stack_abt_load_end__ = __stack_abt_end__ 0x00000001 . = ASSERT (((__stack_abt_end__ >= __SRAM_segment_start__) && (__stack_abt_end__ <= (__SRAM_segment_start__ + 0x4000))), error: .stack_abt is too large to fit in SRAM memory segment) - 0x40001128 __stack_und_load_start__ = ALIGN (__stack_abt_end__, 0x4) + 0x40001130 __stack_und_load_start__ = ALIGN (__stack_abt_end__, 0x4) -.stack_und 0x40001128 0x0 - 0x40001128 __stack_und_start__ = . +.stack_und 0x40001130 0x0 + 0x40001130 __stack_und_start__ = . *(.stack_und .stack_und.*) - 0x40001128 . = ALIGN (MAX ((__stack_und_start__ + __STACKSIZE_UND__), .), 0x4) - 0x40001128 __stack_und_end__ = (__stack_und_start__ + SIZEOF (.stack_und)) - 0x40001128 __stack_und_load_end__ = __stack_und_end__ + 0x40001130 . = ALIGN (MAX ((__stack_und_start__ + __STACKSIZE_UND__), .), 0x4) + 0x40001130 __stack_und_end__ = (__stack_und_start__ + SIZEOF (.stack_und)) + 0x40001130 __stack_und_load_end__ = __stack_und_end__ 0x00000001 . = ASSERT (((__stack_und_end__ >= __SRAM_segment_start__) && (__stack_und_end__ <= (__SRAM_segment_start__ + 0x4000))), error: .stack_und is too large to fit in SRAM memory segment) - 0x00001418 __fast_load_start__ = ALIGN ((__data_load_start__ + SIZEOF (.data)), 0x4) + 0x000015c8 __fast_load_start__ = ALIGN ((__data_load_start__ + SIZEOF (.data)), 0x4) -.fast 0x40001128 0x0 load address 0x00001418 - 0x40001128 __fast_start__ = . +.fast 0x40001130 0x0 load address 0x000015c8 + 0x40001130 __fast_start__ = . *(.fast .fast.*) - 0x40001128 __fast_end__ = (__fast_start__ + SIZEOF (.fast)) - 0x00001418 __fast_load_end__ = (__fast_load_start__ + SIZEOF (.fast)) - 0x00001418 __FLASH_segment_used_end__ = (ALIGN ((__data_load_start__ + SIZEOF (.data)), 0x4) + SIZEOF (.fast)) + 0x40001130 __fast_end__ = (__fast_start__ + SIZEOF (.fast)) + 0x000015c8 __fast_load_end__ = (__fast_load_start__ + SIZEOF (.fast)) + 0x000015c8 __FLASH_segment_used_end__ = (ALIGN ((__data_load_start__ + SIZEOF (.data)), 0x4) + SIZEOF (.fast)) 0x00000001 . = ASSERT ((((__fast_load_start__ + SIZEOF (.fast)) >= __FLASH_segment_start__) && ((__fast_load_start__ + SIZEOF (.fast)) <= (__FLASH_segment_start__ + 0x40000))), error: .fast is too large to fit in FLASH memory segment) -.fast_run 0x40001128 0x0 - 0x40001128 __fast_run_start__ = . - 0x40001128 . = MAX ((__fast_run_start__ + SIZEOF (.fast)), .) - 0x40001128 __fast_run_end__ = (__fast_run_start__ + SIZEOF (.fast_run)) - 0x40001128 __fast_run_load_end__ = __fast_run_end__ - 0x40001128 __SRAM_segment_used_end__ = (ALIGN (__stack_und_end__, 0x4) + SIZEOF (.fast_run)) +.fast_run 0x40001130 0x0 + 0x40001130 __fast_run_start__ = . + 0x40001130 . = MAX ((__fast_run_start__ + SIZEOF (.fast)), .) + 0x40001130 __fast_run_end__ = (__fast_run_start__ + SIZEOF (.fast_run)) + 0x40001130 __fast_run_load_end__ = __fast_run_end__ + 0x40001130 __SRAM_segment_used_end__ = (ALIGN (__stack_und_end__, 0x4) + SIZEOF (.fast_run)) 0x00000001 . = ASSERT (((__fast_run_end__ >= __SRAM_segment_start__) && (__fast_run_end__ <= (__SRAM_segment_start__ + 0x4000))), error: .fast_run is too large to fit in SRAM memory segment) START GROUP LOAD ARM Flash Debug/../../obj/hooks.o LOAD ARM Flash Debug/../../obj/main.o +LOAD ARM Flash Debug/../../obj/extflash.o LOAD ARM Flash Debug/../../obj/cstart.o LOAD ARM Flash Debug/../../obj/flash.o LOAD ARM Flash Debug/../../obj/can.o @@ -518,91 +526,97 @@ LOAD C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib END GROUP OUTPUT(D:/usr/feaser/software/OpenBLT/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/ide/../bin/openbtl_olimex_lpc_l2294_20mhz.elf elf32-littlearm) -.debug_info 0x00000000 0x188c +.debug_info 0x00000000 0x1809 .debug_info 0x00000000 0x5a ARM Flash Debug/../../obj/hooks.o - .debug_info 0x0000005a 0x111 ARM Flash Debug/../../obj/main.o - .debug_info 0x0000016b 0x110 ARM Flash Debug/../../obj/cstart.o - .debug_info 0x0000027b 0x5b2 ARM Flash Debug/../../obj/flash.o - .debug_info 0x0000082d 0x5a ARM Flash Debug/../../obj/can.o - .debug_info 0x00000887 0x13a ARM Flash Debug/../../obj/cpu.o - .debug_info 0x000009c1 0x15e ARM Flash Debug/../../obj/nvm.o - .debug_info 0x00000b1f 0x143 ARM Flash Debug/../../obj/timer.o - .debug_info 0x00000c62 0x232 ARM Flash Debug/../../obj/uart.o - .debug_info 0x00000e94 0xe4 ARM Flash Debug/../../obj/assert.o - .debug_info 0x00000f78 0xa4 ARM Flash Debug/../../obj/backdoor.o - .debug_info 0x0000101c 0x88 ARM Flash Debug/../../obj/boot.o - .debug_info 0x000010a4 0x18b ARM Flash Debug/../../obj/com.o - .debug_info 0x0000122f 0x86 ARM Flash Debug/../../obj/cop.o - .debug_info 0x000012b5 0x5d7 ARM Flash Debug/../../obj/xcp.o + .debug_info 0x0000005a 0x116 ARM Flash Debug/../../obj/main.o + .debug_info 0x00000170 0x5a ARM Flash Debug/../../obj/extflash.o + .debug_info 0x000001ca 0x110 ARM Flash Debug/../../obj/cstart.o + .debug_info 0x000002da 0x539 ARM Flash Debug/../../obj/flash.o + .debug_info 0x00000813 0x5a ARM Flash Debug/../../obj/can.o + .debug_info 0x0000086d 0x13a ARM Flash Debug/../../obj/cpu.o + .debug_info 0x000009a7 0x15e ARM Flash Debug/../../obj/nvm.o + .debug_info 0x00000b05 0x119 ARM Flash Debug/../../obj/timer.o + .debug_info 0x00000c1e 0x1bf ARM Flash Debug/../../obj/uart.o + .debug_info 0x00000ddd 0xe4 ARM Flash Debug/../../obj/assert.o + .debug_info 0x00000ec1 0xa4 ARM Flash Debug/../../obj/backdoor.o + .debug_info 0x00000f65 0x88 ARM Flash Debug/../../obj/boot.o + .debug_info 0x00000fed 0x18b ARM Flash Debug/../../obj/com.o + .debug_info 0x00001178 0x86 ARM Flash Debug/../../obj/cop.o + .debug_info 0x000011fe 0x60b ARM Flash Debug/../../obj/xcp.o -.debug_abbrev 0x00000000 0xa94 +.debug_abbrev 0x00000000 0xa6c .debug_abbrev 0x00000000 0x28 ARM Flash Debug/../../obj/hooks.o - .debug_abbrev 0x00000028 0xaf ARM Flash Debug/../../obj/main.o - .debug_abbrev 0x000000d7 0x12 ARM Flash Debug/../../obj/cstart.o - .debug_abbrev 0x000000e9 0x21f ARM Flash Debug/../../obj/flash.o - .debug_abbrev 0x00000308 0x28 ARM Flash Debug/../../obj/can.o - .debug_abbrev 0x00000330 0xaf ARM Flash Debug/../../obj/cpu.o - .debug_abbrev 0x000003df 0xa3 ARM Flash Debug/../../obj/nvm.o - .debug_abbrev 0x00000482 0xd9 ARM Flash Debug/../../obj/timer.o - .debug_abbrev 0x0000055b 0x139 ARM Flash Debug/../../obj/uart.o - .debug_abbrev 0x00000694 0x7c ARM Flash Debug/../../obj/assert.o - .debug_abbrev 0x00000710 0x5b ARM Flash Debug/../../obj/backdoor.o - .debug_abbrev 0x0000076b 0x3f ARM Flash Debug/../../obj/boot.o - .debug_abbrev 0x000007aa 0xe0 ARM Flash Debug/../../obj/com.o - .debug_abbrev 0x0000088a 0x3f ARM Flash Debug/../../obj/cop.o - .debug_abbrev 0x000008c9 0x1cb ARM Flash Debug/../../obj/xcp.o + .debug_abbrev 0x00000028 0xc5 ARM Flash Debug/../../obj/main.o + .debug_abbrev 0x000000ed 0x28 ARM Flash Debug/../../obj/extflash.o + .debug_abbrev 0x00000115 0x12 ARM Flash Debug/../../obj/cstart.o + .debug_abbrev 0x00000127 0x21f ARM Flash Debug/../../obj/flash.o + .debug_abbrev 0x00000346 0x28 ARM Flash Debug/../../obj/can.o + .debug_abbrev 0x0000036e 0xaf ARM Flash Debug/../../obj/cpu.o + .debug_abbrev 0x0000041d 0xa3 ARM Flash Debug/../../obj/nvm.o + .debug_abbrev 0x000004c0 0xad ARM Flash Debug/../../obj/timer.o + .debug_abbrev 0x0000056d 0x110 ARM Flash Debug/../../obj/uart.o + .debug_abbrev 0x0000067d 0x7c ARM Flash Debug/../../obj/assert.o + .debug_abbrev 0x000006f9 0x5b ARM Flash Debug/../../obj/backdoor.o + .debug_abbrev 0x00000754 0x3f ARM Flash Debug/../../obj/boot.o + .debug_abbrev 0x00000793 0xe0 ARM Flash Debug/../../obj/com.o + .debug_abbrev 0x00000873 0x3f ARM Flash Debug/../../obj/cop.o + .debug_abbrev 0x000008b2 0x1ba ARM Flash Debug/../../obj/xcp.o -.debug_line 0x00000000 0x1277 +.debug_line 0x00000000 0x1245 .debug_line 0x00000000 0x1d ARM Flash Debug/../../obj/hooks.o - .debug_line 0x0000001d 0x14e ARM Flash Debug/../../obj/main.o - .debug_line 0x0000016b 0x19e ARM Flash Debug/../../obj/cstart.o - .debug_line 0x00000309 0x2e6 ARM Flash Debug/../../obj/flash.o - .debug_line 0x000005ef 0x1d ARM Flash Debug/../../obj/can.o - .debug_line 0x0000060c 0xf0 ARM Flash Debug/../../obj/cpu.o - .debug_line 0x000006fc 0x110 ARM Flash Debug/../../obj/nvm.o - .debug_line 0x0000080c 0x11b ARM Flash Debug/../../obj/timer.o - .debug_line 0x00000927 0x16a ARM Flash Debug/../../obj/uart.o - .debug_line 0x00000a91 0x139 ARM Flash Debug/../../obj/assert.o - .debug_line 0x00000bca 0x156 ARM Flash Debug/../../obj/backdoor.o - .debug_line 0x00000d20 0xbf ARM Flash Debug/../../obj/boot.o - .debug_line 0x00000ddf 0x192 ARM Flash Debug/../../obj/com.o - .debug_line 0x00000f71 0xb7 ARM Flash Debug/../../obj/cop.o - .debug_line 0x00001028 0x24f ARM Flash Debug/../../obj/xcp.o + .debug_line 0x0000001d 0x13a ARM Flash Debug/../../obj/main.o + .debug_line 0x00000157 0x1d ARM Flash Debug/../../obj/extflash.o + .debug_line 0x00000174 0x19e ARM Flash Debug/../../obj/cstart.o + .debug_line 0x00000312 0x2db ARM Flash Debug/../../obj/flash.o + .debug_line 0x000005ed 0x1d ARM Flash Debug/../../obj/can.o + .debug_line 0x0000060a 0xf6 ARM Flash Debug/../../obj/cpu.o + .debug_line 0x00000700 0x112 ARM Flash Debug/../../obj/nvm.o + .debug_line 0x00000812 0x113 ARM Flash Debug/../../obj/timer.o + .debug_line 0x00000925 0x15e ARM Flash Debug/../../obj/uart.o + .debug_line 0x00000a83 0x137 ARM Flash Debug/../../obj/assert.o + .debug_line 0x00000bba 0x150 ARM Flash Debug/../../obj/backdoor.o + .debug_line 0x00000d0a 0xbf ARM Flash Debug/../../obj/boot.o + .debug_line 0x00000dc9 0x192 ARM Flash Debug/../../obj/com.o + .debug_line 0x00000f5b 0xb7 ARM Flash Debug/../../obj/cop.o + .debug_line 0x00001012 0x233 ARM Flash Debug/../../obj/xcp.o -.debug_str 0x00000000 0xdaa +.debug_str 0x00000000 0xe15 .debug_str 0x00000000 0xb1 ARM Flash Debug/../../obj/hooks.o 0xcf (size before relaxing) .debug_str 0x000000b1 0xa4 ARM Flash Debug/../../obj/main.o 0x110 (size before relaxing) - .debug_str 0x00000155 0x24d ARM Flash Debug/../../obj/flash.o + .debug_str 0x00000155 0x6b ARM Flash Debug/../../obj/extflash.o + 0xd2 (size before relaxing) + .debug_str 0x000001c0 0x24d ARM Flash Debug/../../obj/flash.o 0x2d8 (size before relaxing) - .debug_str 0x000003a2 0x83 ARM Flash Debug/../../obj/can.o + .debug_str 0x0000040d 0x83 ARM Flash Debug/../../obj/can.o 0xea (size before relaxing) - .debug_str 0x00000425 0xc7 ARM Flash Debug/../../obj/cpu.o + .debug_str 0x00000490 0xc7 ARM Flash Debug/../../obj/cpu.o 0x157 (size before relaxing) - .debug_str 0x000004ec 0xb7 ARM Flash Debug/../../obj/nvm.o + .debug_str 0x00000557 0xb7 ARM Flash Debug/../../obj/nvm.o 0x14f (size before relaxing) - .debug_str 0x000005a3 0x10b ARM Flash Debug/../../obj/timer.o + .debug_str 0x0000060e 0x10b ARM Flash Debug/../../obj/timer.o 0x17d (size before relaxing) - .debug_str 0x000006ae 0x11f ARM Flash Debug/../../obj/uart.o + .debug_str 0x00000719 0x11f ARM Flash Debug/../../obj/uart.o 0x1b4 (size before relaxing) - .debug_str 0x000007cd 0xb8 ARM Flash Debug/../../obj/assert.o + .debug_str 0x00000838 0xb8 ARM Flash Debug/../../obj/assert.o 0x134 (size before relaxing) - .debug_str 0x00000885 0xa3 ARM Flash Debug/../../obj/backdoor.o + .debug_str 0x000008f0 0xa3 ARM Flash Debug/../../obj/backdoor.o 0x113 (size before relaxing) - .debug_str 0x00000928 0x89 ARM Flash Debug/../../obj/boot.o + .debug_str 0x00000993 0x89 ARM Flash Debug/../../obj/boot.o 0xf0 (size before relaxing) - .debug_str 0x000009b1 0x102 ARM Flash Debug/../../obj/com.o + .debug_str 0x00000a1c 0x102 ARM Flash Debug/../../obj/com.o 0x19c (size before relaxing) - .debug_str 0x00000ab3 0x89 ARM Flash Debug/../../obj/cop.o + .debug_str 0x00000b1e 0x89 ARM Flash Debug/../../obj/cop.o 0xf0 (size before relaxing) - .debug_str 0x00000b3c 0x26e ARM Flash Debug/../../obj/xcp.o + .debug_str 0x00000ba7 0x26e ARM Flash Debug/../../obj/xcp.o 0x312 (size before relaxing) .comment 0x00000000 0x11 .comment 0x00000000 0x11 ARM Flash Debug/../../obj/hooks.o 0x12 (size before relaxing) .comment 0x00000000 0x12 ARM Flash Debug/../../obj/main.o + .comment 0x00000000 0x12 ARM Flash Debug/../../obj/extflash.o .comment 0x00000000 0x12 ARM Flash Debug/../../obj/flash.o .comment 0x00000000 0x12 ARM Flash Debug/../../obj/can.o .comment 0x00000000 0x12 ARM Flash Debug/../../obj/cpu.o @@ -623,98 +637,100 @@ OUTPUT(D:/usr/feaser/software/OpenBLT/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_ .ARM.attributes 0x00000010 0x10 ARM Flash Debug/../../obj/main.o .ARM.attributes - 0x00000020 0x10 ARM Flash Debug/../../obj/cstart.o + 0x00000020 0x10 ARM Flash Debug/../../obj/extflash.o .ARM.attributes - 0x00000030 0x10 ARM Flash Debug/../../obj/flash.o + 0x00000030 0x10 ARM Flash Debug/../../obj/cstart.o .ARM.attributes - 0x00000040 0x10 ARM Flash Debug/../../obj/can.o + 0x00000040 0x10 ARM Flash Debug/../../obj/flash.o .ARM.attributes - 0x00000050 0x10 ARM Flash Debug/../../obj/cpu.o + 0x00000050 0x10 ARM Flash Debug/../../obj/can.o .ARM.attributes - 0x00000060 0x10 ARM Flash Debug/../../obj/nvm.o + 0x00000060 0x10 ARM Flash Debug/../../obj/cpu.o .ARM.attributes - 0x00000070 0x10 ARM Flash Debug/../../obj/timer.o + 0x00000070 0x10 ARM Flash Debug/../../obj/nvm.o .ARM.attributes - 0x00000080 0x10 ARM Flash Debug/../../obj/uart.o + 0x00000080 0x10 ARM Flash Debug/../../obj/timer.o .ARM.attributes - 0x00000090 0x10 ARM Flash Debug/../../obj/assert.o + 0x00000090 0x10 ARM Flash Debug/../../obj/uart.o .ARM.attributes - 0x000000a0 0x10 ARM Flash Debug/../../obj/backdoor.o + 0x000000a0 0x10 ARM Flash Debug/../../obj/assert.o .ARM.attributes - 0x000000b0 0x10 ARM Flash Debug/../../obj/boot.o + 0x000000b0 0x10 ARM Flash Debug/../../obj/backdoor.o .ARM.attributes - 0x000000c0 0x10 ARM Flash Debug/../../obj/com.o + 0x000000c0 0x10 ARM Flash Debug/../../obj/boot.o .ARM.attributes - 0x000000d0 0x10 ARM Flash Debug/../../obj/cop.o + 0x000000d0 0x10 ARM Flash Debug/../../obj/com.o .ARM.attributes - 0x000000e0 0x10 ARM Flash Debug/../../obj/xcp.o + 0x000000e0 0x10 ARM Flash Debug/../../obj/cop.o + .ARM.attributes + 0x000000f0 0x10 ARM Flash Debug/../../obj/xcp.o -.debug_frame 0x00000000 0x548 +.debug_frame 0x00000000 0x5a8 .debug_frame 0x00000000 0x2c ARM Flash Debug/../../obj/main.o - .debug_frame 0x0000002c 0x14c ARM Flash Debug/../../obj/flash.o - .debug_frame 0x00000178 0x68 ARM Flash Debug/../../obj/cpu.o - .debug_frame 0x000001e0 0x9c ARM Flash Debug/../../obj/nvm.o - .debug_frame 0x0000027c 0x6c ARM Flash Debug/../../obj/timer.o - .debug_frame 0x000002e8 0x64 ARM Flash Debug/../../obj/uart.o - .debug_frame 0x0000034c 0x2c ARM Flash Debug/../../obj/assert.o - .debug_frame 0x00000378 0x48 ARM Flash Debug/../../obj/backdoor.o - .debug_frame 0x000003c0 0x48 ARM Flash Debug/../../obj/boot.o - .debug_frame 0x00000408 0xa0 ARM Flash Debug/../../obj/com.o - .debug_frame 0x000004a8 0x30 ARM Flash Debug/../../obj/cop.o - .debug_frame 0x000004d8 0x70 ARM Flash Debug/../../obj/xcp.o + .debug_frame 0x0000002c 0x160 ARM Flash Debug/../../obj/flash.o + .debug_frame 0x0000018c 0x68 ARM Flash Debug/../../obj/cpu.o + .debug_frame 0x000001f4 0x9c ARM Flash Debug/../../obj/nvm.o + .debug_frame 0x00000290 0x78 ARM Flash Debug/../../obj/timer.o + .debug_frame 0x00000308 0x90 ARM Flash Debug/../../obj/uart.o + .debug_frame 0x00000398 0x2c ARM Flash Debug/../../obj/assert.o + .debug_frame 0x000003c4 0x48 ARM Flash Debug/../../obj/backdoor.o + .debug_frame 0x0000040c 0x48 ARM Flash Debug/../../obj/boot.o + .debug_frame 0x00000454 0xa4 ARM Flash Debug/../../obj/com.o + .debug_frame 0x000004f8 0x30 ARM Flash Debug/../../obj/cop.o + .debug_frame 0x00000528 0x80 ARM Flash Debug/../../obj/xcp.o -.debug_loc 0x00000000 0xb3b - .debug_loc 0x00000000 0x99 ARM Flash Debug/../../obj/main.o - .debug_loc 0x00000099 0x4e7 ARM Flash Debug/../../obj/flash.o - .debug_loc 0x00000580 0xe2 ARM Flash Debug/../../obj/cpu.o - .debug_loc 0x00000662 0xff ARM Flash Debug/../../obj/nvm.o - .debug_loc 0x00000761 0x20 ARM Flash Debug/../../obj/timer.o - .debug_loc 0x00000781 0xd9 ARM Flash Debug/../../obj/uart.o - .debug_loc 0x0000085a 0x46 ARM Flash Debug/../../obj/assert.o - .debug_loc 0x000008a0 0x40 ARM Flash Debug/../../obj/backdoor.o - .debug_loc 0x000008e0 0x40 ARM Flash Debug/../../obj/boot.o - .debug_loc 0x00000920 0xa6 ARM Flash Debug/../../obj/com.o - .debug_loc 0x000009c6 0x175 ARM Flash Debug/../../obj/xcp.o +.debug_loc 0x00000000 0xb16 + .debug_loc 0x00000000 0x20 ARM Flash Debug/../../obj/main.o + .debug_loc 0x00000020 0x4a6 ARM Flash Debug/../../obj/flash.o + .debug_loc 0x000004c6 0x109 ARM Flash Debug/../../obj/cpu.o + .debug_loc 0x000005cf 0xff ARM Flash Debug/../../obj/nvm.o + .debug_loc 0x000006ce 0x40 ARM Flash Debug/../../obj/timer.o + .debug_loc 0x0000070e 0xe9 ARM Flash Debug/../../obj/uart.o + .debug_loc 0x000007f7 0x46 ARM Flash Debug/../../obj/assert.o + .debug_loc 0x0000083d 0x40 ARM Flash Debug/../../obj/backdoor.o + .debug_loc 0x0000087d 0x40 ARM Flash Debug/../../obj/boot.o + .debug_loc 0x000008bd 0xb2 ARM Flash Debug/../../obj/com.o + .debug_loc 0x0000096f 0x1a7 ARM Flash Debug/../../obj/xcp.o -.debug_aranges 0x00000000 0x2b0 +.debug_aranges 0x00000000 0x2d0 .debug_aranges 0x00000000 0x20 ARM Flash Debug/../../obj/main.o .debug_aranges 0x00000020 0x28 ARM Flash Debug/../../obj/cstart.o .debug_aranges - 0x00000048 0x68 ARM Flash Debug/../../obj/flash.o + 0x00000048 0x70 ARM Flash Debug/../../obj/flash.o .debug_aranges - 0x000000b0 0x30 ARM Flash Debug/../../obj/cpu.o + 0x000000b8 0x30 ARM Flash Debug/../../obj/cpu.o .debug_aranges - 0x000000e0 0x40 ARM Flash Debug/../../obj/nvm.o + 0x000000e8 0x40 ARM Flash Debug/../../obj/nvm.o .debug_aranges - 0x00000120 0x40 ARM Flash Debug/../../obj/timer.o + 0x00000128 0x40 ARM Flash Debug/../../obj/timer.o .debug_aranges - 0x00000160 0x30 ARM Flash Debug/../../obj/uart.o + 0x00000168 0x40 ARM Flash Debug/../../obj/uart.o .debug_aranges - 0x00000190 0x20 ARM Flash Debug/../../obj/assert.o + 0x000001a8 0x20 ARM Flash Debug/../../obj/assert.o .debug_aranges - 0x000001b0 0x28 ARM Flash Debug/../../obj/backdoor.o + 0x000001c8 0x28 ARM Flash Debug/../../obj/backdoor.o .debug_aranges - 0x000001d8 0x28 ARM Flash Debug/../../obj/boot.o + 0x000001f0 0x28 ARM Flash Debug/../../obj/boot.o .debug_aranges - 0x00000200 0x48 ARM Flash Debug/../../obj/com.o + 0x00000218 0x48 ARM Flash Debug/../../obj/com.o .debug_aranges - 0x00000248 0x28 ARM Flash Debug/../../obj/cop.o + 0x00000260 0x28 ARM Flash Debug/../../obj/cop.o .debug_aranges - 0x00000270 0x40 ARM Flash Debug/../../obj/xcp.o + 0x00000288 0x48 ARM Flash Debug/../../obj/xcp.o -.debug_ranges 0x00000000 0x308 - .debug_ranges 0x00000000 0x50 ARM Flash Debug/../../obj/main.o - .debug_ranges 0x00000050 0x20 ARM Flash Debug/../../obj/cstart.o - .debug_ranges 0x00000070 0x58 ARM Flash Debug/../../obj/flash.o - .debug_ranges 0x000000c8 0x20 ARM Flash Debug/../../obj/cpu.o - .debug_ranges 0x000000e8 0x30 ARM Flash Debug/../../obj/nvm.o - .debug_ranges 0x00000118 0x30 ARM Flash Debug/../../obj/timer.o - .debug_ranges 0x00000148 0x90 ARM Flash Debug/../../obj/uart.o - .debug_ranges 0x000001d8 0x10 ARM Flash Debug/../../obj/assert.o - .debug_ranges 0x000001e8 0x18 ARM Flash Debug/../../obj/backdoor.o - .debug_ranges 0x00000200 0x18 ARM Flash Debug/../../obj/boot.o - .debug_ranges 0x00000218 0x38 ARM Flash Debug/../../obj/com.o - .debug_ranges 0x00000250 0x18 ARM Flash Debug/../../obj/cop.o - .debug_ranges 0x00000268 0xa0 ARM Flash Debug/../../obj/xcp.o +.debug_ranges 0x00000000 0x208 + .debug_ranges 0x00000000 0x10 ARM Flash Debug/../../obj/main.o + .debug_ranges 0x00000010 0x20 ARM Flash Debug/../../obj/cstart.o + .debug_ranges 0x00000030 0x60 ARM Flash Debug/../../obj/flash.o + .debug_ranges 0x00000090 0x20 ARM Flash Debug/../../obj/cpu.o + .debug_ranges 0x000000b0 0x30 ARM Flash Debug/../../obj/nvm.o + .debug_ranges 0x000000e0 0x30 ARM Flash Debug/../../obj/timer.o + .debug_ranges 0x00000110 0x30 ARM Flash Debug/../../obj/uart.o + .debug_ranges 0x00000140 0x10 ARM Flash Debug/../../obj/assert.o + .debug_ranges 0x00000150 0x18 ARM Flash Debug/../../obj/backdoor.o + .debug_ranges 0x00000168 0x18 ARM Flash Debug/../../obj/boot.o + .debug_ranges 0x00000180 0x38 ARM Flash Debug/../../obj/com.o + .debug_ranges 0x000001b8 0x18 ARM Flash Debug/../../obj/cop.o + .debug_ranges 0x000001d0 0x38 ARM Flash Debug/../../obj/xcp.o diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/bin/openbtl_olimex_lpc_l2294_20mhz.srec b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/bin/openbtl_olimex_lpc_l2294_20mhz.srec index 2c358d52..9d92f99a 100644 --- a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/bin/openbtl_olimex_lpc_l2294_20mhz.srec +++ b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/bin/openbtl_olimex_lpc_l2294_20mhz.srec @@ -38,7 +38,7 @@ S1130228280000EB2C019FE52C119FE5001041E00C S1130238080051E30020A0A3042080A4001080A596 S1130248E8009FE5E8109FE5010050E1BEFFFF0AC2 S1130258042090E403002DE90FE0A0E112FF2FE150 -S11302680300BDE8B0FFFFEAF30200EB0000A0E3DF +S11302680300BDE8B0FFFFEA180300EB0000A0E3B9 S11302780010A0E3E4209FE50FE0A0E112FF2FE1C6 S1130288010050E10EF0A001012052E00EF0A0019F S1130298013080E1023083E1030013E30400001A13 @@ -47,279 +47,306 @@ S11302B80EF0A0E10130D0E40130C1E4012052E2A3 S11302C8FBFFFF1A0EF0A0E1010050E10EF0A001BF S11302D80120C0E4FBFFFFEAFEFFFFEAFEFFFFEA9E S11302E8FEFFFFEAFEFFFFEAFEFFFFEA40C01FE051 -S11302F8281100402811004028100040281100400F -S113030828110040280F0040181400003C02004047 -S11303183C020040700300007003000060120000FB -S11303281814000028110040281100406012000031 -S113033860120000601200006012000060120000E9 -S1130348601200006012000060120000181400001F -S11303583C0200402807004028070040280B0040C2 +S11302F830110040301100403010004030110040EF +S113030830110040300F0040C81500003C02004086 +S11303183C02004070030000700300007C140000DD +S1130328C815000030110040301100407C14000052 +S11303387C1400007C1400007C1400007C14000071 +S11303487C1400007C1400007C140000C815000014 +S11303583C0200403007004030070040300B0040AA S10B0368700300000000A0E195 -S113037004E02DE5E4009FE5E4109FE5E4209FE51B -S11303800040A0E300C0D4E7910C0CE026CA4CE284 -S113039016CE4CE202005CE1FF3004E20300009A56 -S11303A0014084E2040054E3F5FFFF1A260000EA4A -S11303B08322A0E1022082E3AC309FE5FF2002E229 -S11303C08420C3E55510E0E35520A0E30100A0E339 -S11303D08C10C3E58C20C3E58000C3E58C10C3E515 -S11303E08C20C3E50320A0E1B818D2E1010B11E38E -S11303F074309FE5FBFFFF0A0320A0E38020C3E5E0 -S11304005520E0E38C20C3E55520A0E38C20C3E510 -S11304100020A0E30020C3E50420A0E30420C3E5FA -S11304200220A0E30020C3E50120A0E30021C3E5EE -S11304301D3843E2002093E5052082E3002083E594 -S1130440540200EB5A0200EBFDFFFFEA1C009FE59B -S11304507010A0E32C0200EB0430A0E1D3FFFFEA0C -S113046060120000C0D40100A080020000C01FE0A0 -S11304706412000070402DE950509FE50060A0E137 -S11304800040A0E3780200EB003095E5030056E15C -S11304900700003A042095E5023083E0030056E1AA -S11304A028309F350C20A033923424300800D435F2 -S11304B00400003A014084E2100054E30C5085E249 -S11304C0EFFFFF1AFF00A0E37040BDE81EFF2FE11D -S11304D0CC120000F0452DE90070A0E120D04DE2DF -S11304E0000090E5E2FFFFEBFF0050E32F00000A5D -S11304F03230A0E30160A0E300308DE504008DE517 -S113050008008DE514608DE53A51E0E3560200EBF6 -S11305100D00A0E114108DE20FE0A0E115FF2FE122 -S113052014809DE5000058E32000001A3330A0E356 -S11305300740A0E100308DE5043094E418008DE913 -S113054078309FE502ACA0E310308DE50CA08DE57A -S113055014608DE5440200EB0D00A0E114108DE25F -S11305600FE0A0E115FF2FE114309DE5000053E3F7 -S11305700800A0110E00001A3830A0E300308DE509 -S1130580003097E514608DE518048DE9360200EB20 -S11305900D00A0E114108DE20FE0A0E115FF2FE1A2 -S11305A014009DE5010070E20000A033000000EAA1 -S11305B00000A0E320D08DE2F045BDE81EFF2FE14E -S11305C060EA000074309FE5030050E130402DE9FB -S11305D00040A0E10150A0E10500000A020A51E335 -S11305E00500000ABAFFFFEB000050E30300001A05 -S11305F00E0000EA48409FE5000000EA0340A0E145 -S1130600853BB0E10040A0130900001A003094E5D6 -S1130610050053E10600000A0400A0E1045080E450 -S11306200510A0E1022CA0E3DF0000EB000000EACB -S11306300040A0E10400A0E13040BDE81EFF2FE12E -S11306403C02004040040040F0452DE90380A0E155 -S1130650003090E57F7FC1E3010073E30040A0E137 -S11306600150A0E10260A0E10370C7E304708004BC -S11306700710A001022CA003CB00000B003094E56E -S1130680070053E10400000A0400A0E10710A0E100 -S1130690CBFFFFEB004050E21800000A003094E565 -S11306A0055063E0045085E25CA09FE5055084E0BA -S11306B0027C87E2EC0100EB043084E2053063E065 -S11306C00A0053E10500009A0400A0E10710A0E12C -S11306D0BBFFFFEB004050E20800000A045084E234 -S11306E0018048E20130D6E40888A0E12888B0E11E -S11306F00130C5E4EEFFFF1A0100A0E3000000EAA8 -S11307000400A0E1F045BDE81EFF2FE1FF01000059 -S113071010209FE50030E0E3003082E508209FE5EB -S1130720003082E51EFF2FE1400400403C020040FF -S113073070402DE90040A0E10160A0E10250A0E179 -S11307404BFFFFEBFF0050E30F00000A010044E2FF -S1130750060080E046FFFFEBFF0050E30A00000ABA -S11307607F3FC4E30330C3E3020A53E324009F053D -S11307700638A0E120009F152338A0E10410A0E171 -S11307800520A0E17040BDE8AEFFFFEA0000A0E351 -S11307907040BDE81EFF2FE13C02004040040040D1 -S11307A0F0452DE920D04DE20160A0E10050A0E128 -S11307B02FFFFFEB0040A0E1010045E2060080E0CE -S11307C02BFFFFEBFF0054E3FF0050130060A01366 -S11307D00160A0030050A0E10060A0032C00000A07 -S11307E0000054E12A00008A000054E30460A001E0 -S11307F02700000A100050E32500008A3230A0E3ED -S11308000180A0E338008DE814808DE53A71E0E3BF -S1130810950100EB0D00A0E114108DE20FE0A0E1C2 -S113082017FF2FE114A09DE500005AE31800001AF9 -S11308303430A0E338008DE864309FE514808DE502 -S11308400C308DE5880100EB0D00A0E114108DE261 -S11308500FE0A0E117FF2FE114309DE5000053E302 -S11308600A60A0110A00001A3530A0E338008DE8B0 -S113087014808DE57C0100EB0D00A0E114108DE2E5 -S11308800FE0A0E117FF2FE114609DE5016076E21F -S11308900060A0330600A0E120D08DE2F045BDE861 -S11308A01EFF2FE160EA0000023AA0E3050093E88E -S11308B0000082E0082093E5020080E00C2093E52C -S11308C0020080E0102093E5020080E0142093E50C -S11308D0020080E0182093E51C3093E5020080E0DC -S11308E0030080E0010070E20000A0331EFF2FE14E -S11308F05C309FE511402DE9140093E9024084E047 -S11309000C2093E5024084E0102093E5024084E04B -S1130910142093E5024084E01C2093E5203093E505 -S1130920024084E0034084E0004064E200408DE53E -S1130930DCFFFFEB000054E10100A00314009F154D -S11309400410A0130D20A01178FFFF1B1840BDE870 -S11309501EFF2FE13C0200401420000040009FE5F0 -S1130960003090E5010073E304E02DE50200000A85 -S1130970D7FEFFEB000050E30700000A24009FE5C8 -S1130980003090E5010073E30100A0030200000AB7 -S1130990CFFEFFEB000090E20100A01304E09DE411 -S11309A01EFF2FE13C020040400400400228A0E169 -S11309B070402DE90140A0E12258A0E10060A0E1CF -S11309C0050000EA0130D4E40130C6E4260100EB5E -S11309D0015045E20558A0E12558A0E1000055E387 -S11309E0F7FFFF1A7040BDE81EFF2FE104E02DE57C -S11309F01E0000EB000050E30900000A4020A0E3C1 -S1130A000101A0E3021AA0E3E7FFFFEB18309FE522 -S1130A100220A0E3402083E50131A0E30FE0A0E140 -S1130A2013FF2FE104E09DE41EFF2FE100C01FE04F -S1130A3004E02DE585FDFFEB04E09DE41EFF2FE1BE -S1130A4004E02DE531FFFFEB04E09DE41EFF2FE100 -S1130A5004E02DE535FFFFEB04E09DE41EFF2FE1EC -S1130A6004E02DE54DFFFFEB04E09DE41EFF2FE1C4 -S1130A7004E02DE58BFFFFEB04E09DE41EFF2FE176 -S1130A8004E02DE599FFFFEB000050E3B2FFFF1BEC -S1130A9004E09DE41EFF2FE130309FE530109FE518 -S1130AA00020A0E3142083E5282083E50C1083E5CF -S1130AB00110A0E3041083E5081093E514309FE5CA -S1130AC0001083E510309FE5002083E51EFF2FE131 -S1130AD0004000E05FEA0000480600404406004091 -S1130AE014309FE50020A0E3042083E50C2083E577 -S1130AF0082083E5102083E51EFF2FE1004000E07D -S1130B0024309FE524109FE5082093E520309FE5DD -S1130B10000091E500C093E5000082E000006CE075 -S1130B20000081E5002083E51EFF2FE1004000E086 -S1130B30440600404806004004E02DE5EFFFFFEBCB -S1130B4008309FE5000093E504E09DE41EFF2FE1DB -S1130B504406004034309FE50020A0E37F10E0E32A -S1130B600420C3E50820C3E51420C3E50C10C3E545 -S1130B704110A0E30010C3E50420C3E50320A0E373 -S1130B800C20C3E50720A0E30820C3E51EFF2FE1E6 -S1130B9000C000E0F0412DE9FF6001E2400056E3AF -S1130BA00080A0E1A0009F858310A0835600008BE5 -S1130BB098409FE51430D4E5200013E30060C41589 -S1130BC00100001A040000EAA70000EB1430D4E589 -S1130BD0200013E3FBFFFF0A020000EA68009FE520 -S1130BE08610A0E3480000EB60509FE50040A0E3BE -S1130BF00570A0E10F0000EA9B0000EB1420D5E58E -S1130C000430D8E7200012E30030C5150100001AB3 -S1130C10040000EA940000EB1430D7E5200013E34D -S1130C20FBFFFF0A020000EA1C009FE58E10A0E310 -S1130C30350000EB014084E20438A0E1230856E1CA -S1130C40ECFFFF8AF041BDE81EFF2FE18C1300008A -S1130C5000C000E030402DE99C409FE50020D4E531 -S1130C60000052E394309FE50B00001A1410D3E502 -S1130C70011011E20120A0011C00000A0010D3E5BC -S1130C807C309FE50010C3E50130A0E30030C4E5EB -S1130C9070309FE50020C3E5140000EA1420D3E57A -S1130CA060C09FE5012012E20050DCE50F00000A5D -S1130CB04C109FE50020D3E5053081E00120C3E519 -S1130CC0013085E20020D1E5FF3003E2030052E168 -S1130CD00030CCE50020A0130400001A011081E2CA -S1130CE031FFFFEB0030A0E30030C4E50120A0E3B6 -S1130CF00200A0E13040BDE81EFF2FE18E06004057 -S1130D0000C000E04D0600404C06004014309FE552 -S1130D1004E02DE5000083E50C309FE5001083E539 -S1130D20510000EBFDFFFFEA9006004094060040EE -S1130D3010402DE9470000EB010050E30A00000ACF -S1130D402C409FE50030D4E5010053E30600001A6F -S1130D5078FFFFEB310050E30300009A0030A0E37A -S1130D600030C4E55DFFFFEB1FFFFFEB1040BDE863 -S1130D701EFF2FE19806004014309FE50120A0E3F8 -S1130D8004E02DE50020C3E542FFFFEB04E09DE411 -S1130D90E6FFFFEA9806004004E02DE5310000EB91 -S1130DA0F4FFFFEB25FFFFEB070000EB04E09DE4FD -S1130DB01EFF2FE104E02DE52B0000EB110000EBFA -S1130DC0DAFFFFEB04E09DE41EFF2FE101402DE973 -S1130DD00030E0E30030CDE50030A0E30130CDE5A4 -S1130DE02A0000EB5AFFFFEB14309FE50030D3E5F7 -S1130DF0010053E30D00A0013900000B0840BDE8D9 -S1130E001EFF2FE19906004004E02DE514009FE544 -S1130E108FFFFFEB010050E308009F053000000B3B -S1130E2004E09DE41EFF2FE19A06004004E02DE556 -S1130E30FF1001E256FFFFEB240000EB04E09DE409 -S1130E401EFF2FE108309FE50120A0E30020C3E549 -S1130E501EFF2FE19906004004E02DE5150000EB8C -S1130E6004E09DE41EFF2FE11EFF2FE11EFF2FE192 -S1130E7014309FE50120E0E30320C3E50220A0E352 -S1130E800400C3E5B424C3E11EFF2FE1DC060040E7 -S1130E901C309FE50020A0E30020C3E5482083E543 -S1130EA04320C3E5B424C3E10220C3E50120C3E524 -S1130EB01EFF2FE1DC0600400C309FE50000D3E567 -S1130EC0000090E20100A0131EFF2FE1DC060040A9 -S1130ED008309FE50020A0E34320C3E51EFF2FE177 -S1130EE0DC06004070402DE90030D0E5FF0053E3FC -S1130EF00050A0E158439FE50D00001A0010E0E304 -S1130F000310C4E51010A0E30020A0E30130A0E327 -S1130F100410C4E54010A0E30120C4E50030C4E59A -S1130F200520C4E50610C4E50710C4E50820C4E59F -S1130F30640000EA0060D4E5010056E3C200001A30 -S1130F40F30053E33900000A0D00008ACF0053E395 -S1130F50AA00000A0400008AC90053E36E00000AD4 -S1130F60CC0053E3AC00001AA90000EAD10053E31B -S1130F709C00000A7400003AD20053E3A600001A51 -S1130F808B0000EAFA0053E34300000A0500008ADC -S1130F90F50053E30A00000A0F00003AF60053E399 -S1130FA09D00001A1D0000EAFD0053E34B00000AF7 -S1130FB0FE0053E35400000AFC0053E39600001AB9 -S1130FC0440000EA0120D0E53F0052E3040084928B -S1130FD0481094950700009A5E0000EA0130D0E5BD -S1130FE03F0053E35B00008A041090E5481084E559 -S1130FF00120D5E5040084E26BFEFFEB0030E0E362 -S11310000330C4E5483094E50120D5E5033082E09F -S1131010483084E50130D5E5013083E26F0000EA11 -S11310200030E0E30330C4E5043090E5440000EA16 -S11310300030E0E30330C4E50030A0E3480094E569 -S1131040041095E50320A0E1030000EA00C0D3E703 -S11310500C2082E0FF2002E2013083E2010053E130 -S1131060F9FFFF1AE8319FE50720C3E5222CA0E130 -S11310700A20C3E50120A0E30010A0E30420C3E597 -S11310800820A0E30810C3E50910C3E50510C3E573 -S11310900610C3E5B424C3E1610000EA0030E0E3D4 -S11310A00330C4E5AC319FE50720A0E3483084E574 -S11310B00030A0E30430C4E50530C4E50630C4E5DF -S11310C00720C4E50830C4E50930C4E50A30C4E5A6 -S11310D00830A0E3410000EA0000A0E34F0000EA6A -S11310E00030E0E30120D4E50330C4E50030A0E3A0 -S11310F00430C4E50630C4E50730C4E50830C4E56F -S11311000520C4E50630A0E3340000EA0030A0E383 -S11311100030C4E50130C4E5390000EA480094E534 -S11311203F10A0E3012085E248FEFFEB000050E3FE -S11311303700000A0030E0E30330C4E5483094E5AA -S11311403F3083E2483084E52F0000EA0130D0E5E7 -S11311503E0053E30100009A2200A0E32F0000EABE -S11311600030E0E30330C4E5B464C4E10110D0E529 -S1131170000051E30300001A40FEFFEB000050E3BF -S11311802700001A220000EAC4409FE5022085E2FD -S1131190480094E52DFEFFEB000050E31C00000A1C -S11311A00120D5E5483094E5033082E0483084E5F9 -S11311B01B0000EA0030E0E34020A0E30330C4E574 -S11311C00620C4E50030A0E30430C4E50530C4E5DE -S11311D00730C4E50830C4E50930C4E50730A0E3AE -S11311E0B434C4E10E0000EA480094E5041095E527 -S11311F01AFEFFEB000050E30100001A040000EAAD -S11312000AFEFFEB0030E0E30330C4E5B464C4E15C -S1131210030000EA3100A0E3000000EA2000A0E39C -S113122012FFFFEB28409FE54330D4E5010053E370 -S11312301000A0030DFFFF0B0130A0E318009FE591 -S1131240B414D4E14330C4E5F7FEFFEB7040BDE8CD -S11312501EFF2FE1DC06004010140000DF060040F2 -S113126001020408443A2F7573722F666561736531 -S1131270722F736F6674776172652F4F70656E425B -S11312804C542F5461726765742F44656D6F2F4100 -S1131290524D375F4C5043323030305F4F6C696D84 -S11312A065785F4C50435F4C323239345F43726F20 -S11312B07373776F726B732F426F6F742F696465EA -S11312C02F2E2E2F6D61696E2E630000002000000A -S11312D00020000001000000004000000020000089 -S11312E00200000000600000002000000300000075 -S11312F000800000002000000400000000A00000A6 -S1131300002000000500000000C0000000200000D4 -S11313100600000000E000000020000007000000BC -S113132000000100000001000800000000000200AD -S1131330000001000900000000000300002000007C -S11313400A00000000200300002000000B00000041 -S113135000400300002000000C00000000600300B7 -S1131360002000000D0000000080030000200000A9 -S11313700E00000000A00300002000000F00000089 -S113138000C003000020000010000000443A2F7544 -S113139073722F6665617365722F736F66747761FC -S11313A072652F4F70656E424C542F54617267659D -S11313B0742F44656D6F2F41524D375F4C5043324B -S11313C03030305F4F6C696D65785F4C50435F4CD3 -S11313D0323239345F43726F7373776F726B732F6A -S11313E0426F6F742F6964652F2E2E2F2E2E2F2E91 -S11313F02E2F2E2E2F536F757263652F41524D374A -S11314005F4C5043323030302F756172742E63005C -S10B14104F70656E424C54005C +S113037004E02DE588309FE52220A0E38420C3E536 +S11303805510E0E38C10C3E55520A0E38C20C3E5B1 +S11303900100A0E38000C3E58C10C3E58C20C3E515 +S11303A0B828D3E1010B12E3FCFFFF0A50309FE5AC +S11303B00320A0E38020C3E55520E0E38C20C3E5BF +S11303C05520A0E38C20C3E50020A0E30020C3E572 +S11303D00420A0E30420C3E50220A0E30020C3E539 +S11303E00120A0E30021C3E51D3843E2002093E58A +S11303F0052082E3002083E5890200EB8F0200EBF5 +S1130400FDFFFFEA00C01FE070402DE90060A0E19D +S113041050509FE50040A0E3B80200EB003095E5A2 +S1130420060053E10800008A041095E5013083E0DA +S1130430030056E10400002A842084E024309FE570 +S1130440022183E00800D2E5040000EA014084E2CE +S11304500C5085E2100054E3EEFFFF1AFF00A0E306 +S11304607040BDE81EFF2FE17C14000030402DE9F0 +S113047020D04DE20040A0E1000090E5E1FFFFEB59 +S1130480FF0050E30000A0033700000A3230A0E36D +S11304900C308DE510008DE514008DE50130A0E3EE +S11304A000308DE5950200EB0C008DE20D10A0E10B +S11304B03A31E0E30FE0A0E113FF2FE100309DE5C6 +S11304C0000053E30000A0132700001A3330A0E318 +S11304D00C308DE50450A0E1043095E410308DE536 +S11304E014508DE5023CA0E318308DE584309FE57F +S11304F01C308DE50130A0E300308DE57F0200EB78 +S11305000C008DE20D10A0E13A31E0E30FE0A0E130 +S113051013FF2FE100309DE5000053E30000A0131A +S11305201100001A3830A0E30C308DE5003094E55A +S113053010308DE514508DE5023CA0E318308DE5B4 +S11305400130A0E300308DE56C0200EB0C008DE27D +S11305500D10A0E13A31E0E30FE0A0E113FF2FE139 +S113056000009DE5010070E20000A03320D08DE280 +S11305703040BDE81EFF2FE160EA000004E02DE5F5 +S1130580813BB0E10000A0130700001A003090E5A1 +S1130590010053E10100A0030300000A041080E4F9 +S11305A0022CA0E3090100EB0100A0E304E09DE4B8 +S11305B01EFF2FE130402DE90040A0E10150A0E1F1 +S11305C050309FE5030050E10500000A020A51E3A0 +S11305D00500000AA4FFFFEB000050E30300001A2B +S11305E0080000EA30409FE5000000EA24409FE54F +S11305F00400A0E10510A0E1DFFFFFEB000050E3E1 +S11306000040A003000000EA0040A0E30400A0E1D1 +S11306103040BDE81EFF2FE13C0200404004004092 +S1130620F0452DE90050A0E10140A0E10260A0E105 +S11306300370A0E1A1A4A0E18AA4A0E1003090E5A8 +S1130640010073E30400001A0A10A0E1CAFFFFEBE3 +S1130650000050E30000A0032400000A003095E5E8 +S11306600A0053E10500000A0500A0E10A10A0E118 +S1130670CFFFFFEB005050E20000A0031B00000A74 +S1130680003095E5044063E0044084E2044085E0E2 +S1130690013086E2018047E20888A0E1288883E0EF +S11306A050709FE502AC8AE2140200EB043085E24C +S11306B0043063E0070053E10500009A0500A0E15F +S11306C00A10A0E1BAFFFFEB005050E20600000A56 +S11306D0044085E20130D6E40130C4E4080056E168 +S11306E0F0FFFF1A0100A0E3000000EA0000A0E30D +S11306F0F045BDE81EFF2FE1FF0100000030E0E3FC +S11307000C209FE5003082E508209FE5003082E55B +S11307101EFF2FE1400400403C02004070402DE9E0 +S11307200040A0E10150A0E10260A0E135FFFFEB31 +S1130730FF0050E30000A0030E00000A010044E2A1 +S1130740050080E02FFFFFEBFF0050E30000A00353 +S11307500800000AA434A0E1100053E30538A0E126 +S113076018009F0518009F150410A0E10620A0E1C1 +S11307702338A0E1A9FFFFEB7040BDE81EFF2FE185 +S11307803C0200404004004070402DE920D04DE27E +S11307900050A0E10160A0E11AFFFFEB0040A0E1DE +S11307A0010045E2060080E016FFFFEB0050A0E1E7 +S11307B0FF0050E3FF0054130000A0033900000AB7 +S11307C0050054E10000A0833600008A000054E3D1 +S11307D00000A0033300000A100055E30000A083CA +S11307E03000008A3230A0E300308DE504408DE50E +S11307F008508DE50130A0E314308DE5BF0100EB16 +S11308000D00A0E114108DE23A31E0E30FE0A0E125 +S113081013FF2FE114309DE5000053E30000A01303 +S11308202000001A3430A0E300308DE504408DE54B +S113083008508DE578309FE50C308DE50130A0E35C +S113084014308DE5AD0100EB0D00A0E114108DE234 +S11308503A31E0E30FE0A0E113FF2FE114309DE50E +S1130860000053E30000A0130E00001A3530A0E38B +S113087000308DE504408DE508508DE50130A0E39E +S113088014308DE59D0100EB0D00A0E114108DE204 +S11308903A31E0E30FE0A0E113FF2FE114009DE5FE +S11308A0010070E20000A03320D08DE27040BDE86A +S11308B01EFF2FE160EA0000023AA0E3050093E87E +S11308C0000082E0082093E5020080E00C2093E51C +S11308D0020080E0102093E5020080E0142093E5FC +S11308E0020080E0182093E5020080E01C3093E5CC +S11308F0030080E0010070E20000A0331EFF2FE13E +S113090010402DE904D04DE25C309FE5140093E9DA +S1130910024084E00C2093E5024084E0102093E53B +S1130920024084E0142093E5024084E01C2093E517 +S1130930024084E0203093E5034084E0004064E218 +S113094000408DE5DBFFFFEB000054E10100A00354 +S113095018009F150410A0130D20A0116EFFFF1B9B +S113096004D08DE21040BDE81EFF2FE13C020040A0 +S11309701420000004E02DE548309FE5003093E5A5 +S1130980010073E30400000A38009FE5B6FEFFEBA4 +S1130990000050E30000A0030800000A28309FE58F +S11309A0003093E5010073E30100A0030300000A93 +S11309B014009FE5ACFEFFEB000090E20100A013E1 +S11309C004E09DE41EFF2FE13C020040400400408F +S11309D070402DE90160A0E10228A0E12228B0E1E5 +S11309E00900000A0040A0E1010080E2012042E287 +S11309F00258A0E1255880E00130D6E40130C4E477 +S1130A003E0100EB050054E1FAFFFF1A7040BDE817 +S1130A101EFF2FE104E02DE51E0000EB000050E373 +S1130A200900000A0101A0E3021AA0E34020A0E3A8 +S1130A30E6FFFFEB0220A0E314309FE5402083E5AE +S1130A400131A0E30FE0A0E113FF2FE104E09DE4F6 +S1130A501EFF2FE100C01FE004E02DE57BFDFFEB4E +S1130A6004E09DE41EFF2FE104E02DE522FFFFEBEF +S1130A7004E09DE41EFF2FE104E02DE526FFFFEBDB +S1130A8004E09DE41EFF2FE104E02DE53DFFFFEBB4 +S1130A9004E09DE41EFF2FE104E02DE585FFFFEB5C +S1130AA004E09DE41EFF2FE104E02DE593FFFFEB3E +S1130AB0000050E30000A003ADFFFF1B04E09DE431 +S1130AC01EFF2FE114309FE50020A0E3042083E5FE +S1130AD00C2083E5082083E5102083E51EFF2FE129 +S1130AE0004000E024309FE5082093E520109FE5B6 +S1130AF0000091E5000082E018309FE500C093E516 +S1130B0000006CE0000081E5002083E51EFF2FE17A +S1130B10004000E0440600404806004004309FE5E1 +S1130B20000083E51EFF2FE14406004004E02DE5AC +S1130B3030309FE50000A0E3140083E5280083E53E +S1130B4024209FE50C2083E50120A0E3042083E515 +S1130B50082093E514309FE5002083E5EEFFFFEBCA +S1130B6004E09DE41EFF2FE1004000E05FEA000086 +S1130B704806004004E02DE5D9FFFFEB08309FE56F +S1130B80000093E504E09DE41EFF2FE144060040CD +S1130B901C309FE51430D3E5010013E310309F159A +S1130BA00030D3150030C0150100A0130000A003CD +S1130BB01EFF2FE100C000E010402DE944309FE506 +S1130BC01430D3E5200013E30000A0030B00000A57 +S1130BD030309FE50000C3E51430D3E5200013E373 +S1130BE00100A0130500001A18409FE5C30000EBA4 +S1130BF01430D4E5200013E3FBFFFF0A0100A0E357 +S1130C001040BDE81EFF2FE100C000E034309FE536 +S1130C100020A0E30420C3E50820C3E51420C3E5B5 +S1130C207F10E0E30C10C3E54110A0E30010C3E51E +S1130C300420C3E50320A0E30C20C3E50720A0E3C0 +S1130C400820C3E51EFF2FE100C000E0F0412DE9BC +S1130C500050A0E1FF4001E2400054E368009F859A +S1130C608310A0834900008B0400A0E1D1FFFFEBB7 +S1130C70010050E350009F158610A0134300001B91 +S1130C800460A0E1000054E30D00000A0040A0E36A +S1130C9034709FE58E80A0E3980000EB0400D5E754 +S1130CA0C4FFFFEB010050E30700A0110810A011DE +S1130CB03600001B014084E20438A0E1230856E119 +S1130CC0F4FFFF8AF041BDE81EFF2FE13C15000050 +S1130CD030402DE90050A0E1A0309FE50030D3E57D +S1130CE0000053E30B00001A94009FE5A7FFFFEBFD +S1130CF0010050E30000A0131E00001A0120A0E32D +S1130D0078309FE50020C3E50000A0E374309FE540 +S1130D100000C3E5170000EA68309FE50040D3E512 +S1130D2064009FE5000084E098FFFFEB010050E3BE +S1130D300000A0130F00001A014084E2FF2004E227 +S1130D4040309FE50020C3E534309FE50030D3E513 +S1130D50020053E10000A0130600001A0500A0E100 +S1130D6024109FE519FFFFEB0020A0E30C309FE562 +S1130D700020C3E50100A0E33040BDE81EFF2FE1E1 +S1130D8094060040500600404C06004051060040C6 +S1130D9004E02DE510309FE5000083E50C309FE56D +S1130DA0001083E5550000EBFDFFFFEA98060040C4 +S1130DB09C06004004E02DE54B0000EB010050E3ED +S1130DC00B00000A30309FE50030D3E5010053E307 +S1130DD00700001A66FFFFEB310050E30400009A9D +S1130DE00020A0E310309FE50020C3E534FFFFEBB3 +S1130DF007FFFFEB04E09DE41EFF2FE1A006004087 +S1130E0004E02DE50120A0E310309FE50020C3E5B8 +S1130E1045FFFFEBE6FFFFEB04E09DE41EFF2FE13F +S1130E20A006004004E02DE5330000EBF3FFFFEBE8 +S1130E300CFFFFEB070000EB04E09DE41EFF2FE135 +S1130E4004E02DE52D0000EB130000EBD8FFFFEBD1 +S1130E5004E09DE41EFF2FE104E02DE504D04DE203 +S1130E600030E0E30030CDE50030A0E30130CDE513 +S1130E70300000EB64FFFFEB18309FE50030D3E552 +S1130E80010053E30D00A0013F00000B04D08DE2EC +S1130E9004E09DE41EFF2FE1A106004004E02DE5DF +S1130EA014009FE589FFFFEB010050E308009F0554 +S1130EB03500000B04E09DE41EFF2FE1A406004072 +S1130EC004E02DE5FF1001E25FFFFFEB290000EBDA +S1130ED004E09DE41EFF2FE10120A0E304309FE520 +S1130EE00020C3E51EFF2FE1A106004004E02DE52C +S1130EF01A0000EB04E09DE41EFF2FE11EFF2FE12A +S1130F001EFF2FE10020A0E304309FE50120C3E58C +S1130F101EFF2FE1E406004014309FE50120E0E3CA +S1130F200320C3E50400C3E50220A0E3B424C3E125 +S1130F301EFF2FE1E40600401C309FE50020A0E3E3 +S1130F400020C3E5482083E54320C3E5B424C3E17E +S1130F500220C3E50120C3E51EFF2FE1E4060040A3 +S1130F600C309FE50000D3E5000090E20100A013DF +S1130F701EFF2FE1E40600400020A0E304309FE5BB +S1130F804320C3E51EFF2FE1E406004030402DE975 +S1130F900040A0E10030D0E5FF0053E31200001A46 +S1130FA0D7FFFFEBC8349FE50120A0E30020C3E591 +S1130FB00010E0E30310C3E51010A0E30410C3E540 +S1130FC00010A0E30510C3E54000A0E30600C3E55C +S1130FD00700C3E50810C3E50920C3E50A20C3E5FB +S1130FE00820A0E3B424C3E1140100EA80249FE5AF +S1130FF00020D2E5010052E31B01001AC93043E28C +S1131000350053E303F19F970A0100EAC41200007C +S113101038140000381400002C14000038140000A8 +S1131020381400001014000010130000D413000042 +S11310309C13000038140000381400003814000019 +S1131040381400003814000038140000381400006C +S1131050381400003814000038140000381400005C +S1131060381400003814000038140000381400004C +S1131070381400003814000038140000381400003C +S1131080381400003814000038140000381400002C +S1131090381400003814000038140000381400001C +S11310A0381400003814000038140000381400000C +S11310B038140000AC11000034110000E4100000EA +S11310C08C1100003814000038140000381400009B +S11310D01C12000038140000601200006C120000A2 +S11310E0A01200000120D0E53F0052E30200009A64 +S11310F02200A0E387FFFFEBD00000EA70539FE5D6 +S1131100040085E2481095E530FEFFEB0030E0E393 +S11311100330C5E50120D4E5483095E5033082E08D +S1131120483085E50130D4E5013083E2B434C5E1CB +S1131130C20000EA0130D0E53F0053E30200009A08 +S11311402200A0E373FFFFEBBC0000EA041090E56B +S11311501C539FE5481085E5040085E20120D4E591 +S11311601AFEFFEB0030E0E30330C5E50120D4E5CF +S1131170483095E5033082E0483085E50130D4E518 +S1131180013083E2B434C5E1AC0000EAE0329FE50B +S11311900020E0E30320C3E5042090E5482083E534 +S11311A00120A0E3B424C3E1A40000EAC0329FE517 +S11311B00020E0E30320C3E5481093E5043090E504 +S11311C0000053E30020A0030500000A0020A0E370 +S11311D00100D1E4002082E0FF2002E2013053E26A +S11311E0FAFFFF1A88329FE50010A0E30720C3E549 +S11311F00810C3E50910C3E5222CA0E10A20C3E5C9 +S11312000120A0E30420C3E50510C3E50610C3E5EF +S11312100820A0E3B424C3E1880000EA50329FE52B +S11312200020E0E30320C3E548229FE5482083E54E +S11312300020A0E30420C3E50520C3E50620C3E5A0 +S11312400710A0E30710C3E50820C3E50920C3E5A0 +S11312500A20C3E50820A0E3B424C3E1770000EA30 +S11312600000A0E32BFFFFEB740000EA00329FE5CF +S11312700020E0E30320C3E50020A0E30420C3E54D +S11312800110D3E50510C3E50620C3E50720C3E537 +S11312900820C3E50620A0E3B424C3E1670000EA04 +S11312A0CC419FE50030A0E30030C4E514FFFFEB20 +S11312B00030E0E30330C4E50130A0E3B434C4E11A +S11312C05E0000EAA8319FE5480093E53F10A0E3E3 +S11312D0012084E2E7FDFFEB000050E30200001A66 +S11312E03100A0E30BFFFFEB540000EA80319FE5DF +S11312F00020E0E30320C3E5482093E53F2082E299 +S1131300482083E50120A0E3B424C3E14B0000EAB4 +S11313100130D0E53E0053E30200009A2200A0E32E +S1131320FCFEFFEB450000EA44319FE50020E0E3CA +S11313300320C3E50120A0E3B424C3E10110D0E5F8 +S1131340000051E30500001AD6FDFFEB000050E356 +S11313503A00001A3100A0E3EEFEFFEB370000EA8A +S11313600C319FE5480093E5022084E2C1FDFFEBC8 +S1131370000050E30200001A3100A0E3E5FEFFEB99 +S11313802E0000EAE8309FE50110D4E5482093E5FB +S1131390022081E0482083E5280000EAD0309FE560 +S11313A00020E0E30320C3E50020A0E30420C3E51C +S11313B00520C3E54010A0E30610C3E50720C3E5FC +S11313C00820C3E50920C3E50720A0E3B424C3E152 +S11313D01A0000EA98309FE5480093E5041094E56C +S11313E0A8FDFFEB000050E30200001A3100A0E367 +S11313F0C8FEFFEB110000EA74309FE50020E0E333 +S11314000320C3E50120A0E3B424C3E10B0000EAF8 +S113141090FDFFEB58309FE50020E0E30320C3E597 +S11314200120A0E3B424C3E1040000EA3100A0E3F6 +S1131430B8FEFFEB010000EA2000A0E3B5FEFFEBDD +S11314402C309FE54330D3E5010053E31000A003A3 +S1131450B0FEFF0B18309FE50120A0E34320C3E555 +S1131460030083E2B414D3E194FEFFEB3040BDE803 +S10F14701EFF2FE1E4060040C015000040 +S113147C00200000002000000100000000400000DB +S113148C00200000020000000060000000200000AA +S113149C0300000000800000002000000400000095 +S11314AC00A00000002000000500000000C00000A7 +S11314BC002000000600000000E0000000200000F6 +S11314CC07000000000001000000010008000000FB +S11314DC00000200000001000900000000000300ED +S11314EC002000000A00000000200300002000007F +S11314FC0B00000000400300002000000C00000062 +S113150C00600300002000000D00000000800300B8 +S113151C002000000E00000000A0030000200000CA +S113152C0F00000000C003000020000010000000A9 +S113153C443A2F7573722F6665617365722F736FDE +S113154C6674776172652F4F70656E424C542F54DC +S113155C61726765742F44656D6F2F41524D375F0F +S113156C4C5043323030305F4F6C696D65785F4C52 +S113157C50435F4C323239345F43726F7373776FFD +S113158C726B732F426F6F742F6964652F2E2E2F1D +S113159C2E2E2F2E2E2F2E2E2F536F757263652FFA +S11315AC41524D375F4C5043323030302F7561729D +S10F15BC742E63004F70656E424C5400A6 S9030050AC diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/extflash.c b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/extflash.c new file mode 100644 index 00000000..beefab0b --- /dev/null +++ b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/extflash.c @@ -0,0 +1,643 @@ +/**************************************************************************************** +| Description: bootloader external flash driver source file +| File Name: extflash.c +| +|---------------------------------------------------------------------------------------- +| C O P Y R I G H T +|---------------------------------------------------------------------------------------- +| Copyright (c) 2011 by Feaser http://www.feaser.com All rights reserved +| +|---------------------------------------------------------------------------------------- +| L I C E N S E +|---------------------------------------------------------------------------------------- +| This file is part of OpenBLT. OpenBLT 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. +| +| OpenBLT 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 OpenBLT. +| If not, see . +| +| A special exception to the GPL is included to allow you to distribute a combined work +| that includes OpenBLT without being obliged to provide the source code for any +| proprietary components. The exception text is included at the bottom of the license +| file . +| +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "boot.h" /* bootloader generic header */ + + +#if (BOOT_NVM_HOOKS_ENABLE > 0) +/**************************************************************************************** +* Macro definitions +****************************************************************************************/ +#define FLASH_INVALID_SECTOR (0xff) +#define FLASH_INVALID_ADDRESS (0xffffffff) +#define FLASH_WRITE_BLOCK_SIZE (512) +#define FLASH_TOTAL_SECTORS (sizeof(flashLayout)/sizeof(flashLayout[0])) +/* C3 Intel flash commands */ +#define FLASH_CMD_READ_ARRAY_MODE (0xFF) +#define FLASH_CMD_READ_ID_MODE (0x90) +#define FLASH_CMD_ERASE_MODE (0x20) +#define FLASH_CMD_READ_STATUS_MODE (0x70) +#define FLASH_CMD_CHANGE_LOCK_MODE (0x60) +#define FLASH_CMD_UNLOCK_SECTOR (0xD0) +#define FLASH_CMD_LOCK_SECTOR (0x01) +#define FLASH_CMD_PROGRAM_MODE (0x40) +#define FLASH_CMD_ERASE_CONFIRM (0xD0) +#define FLASH_CMD_CLEAR_STATUS (0x50) +/* C3 Intel flash info bits */ +#define FLASH_LOCK_BIT (0x01) +#define FLASH_STATUS_READY_BIT (0x80) +/* C3 Intel flash error codes */ +#define FLASH_ERR_LOCKED (0x02) +#define FLASH_ERR_VPP_RANGE (0x08) +#define FLASH_ERR_PROGRAM (0x10) +#define FLASH_ERR_CMD_SEQ (0x10) +#define FLASH_ERR_ERASE (0x20) +/* flash operation timeout values */ +#define FLASH_ERASE_TIMEOUT ((blt_int32u)5000000) +#define FLASH_PROGRAM_TIMEOUT ((blt_int32u)1000000) +/* supported Intel C3 flash device */ +#define FLASH_DEV_MAN_ID ((blt_int16u)0x0089) +#define FLASH_DEV_ID ((blt_int16u)0x88c3) +/* address offsets for reading device information */ +#define FLASH_DEVINFO_MAN_ID ((blt_int16u)0x0000) +#define FLASH_DEVINFO_DEV_ID ((blt_int16u)0x0001) +#define FLASH_DEVINFO_LOCK_STATUS ((blt_int16u)0x0002) +/* functions implemented in a macro for run-time and codesize optimization */ +#define ExtFlashGetManID() (ExtFlashGetDeviceInfo(flashLayout[0].sector_start, \ + FLASH_DEVINFO_MAN_ID)) +#define ExtFlashGetDevID() (ExtFlashGetDeviceInfo(flashLayout[0].sector_start, \ + FLASH_DEVINFO_DEV_ID)) +#define ExtFlashGetLockStatus(base) (ExtFlashGetDeviceInfo(base, \ + FLASH_DEVINFO_LOCK_STATUS)) + + +/**************************************************************************************** +* Type definitions +****************************************************************************************/ +/* flash sector descriptor type */ +typedef struct +{ + blt_addr sector_start; /* sector start address */ + blt_int32u sector_size; /* sector size in bytes */ + blt_int8u sector_num; /* sector number */ +} tFlashSector; /* flash sector description */ + +/* programming is done per block of max FLASH_WRITE_BLOCK_SIZE. for this a flash block + * manager is implemented in this driver. this flash block manager depends on this + * flash block info structure. It holds the base address of the flash block and the + * data that should be programmed into the flash block. + */ +typedef struct +{ + blt_addr base_addr; + blt_int8u data[FLASH_WRITE_BLOCK_SIZE]; +} tFlashBlockInfo; + + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +static blt_bool ExtFlashInitBlock(tFlashBlockInfo *block, blt_addr address); +static tFlashBlockInfo *ExtFlashSwitchBlock(tFlashBlockInfo *block, blt_addr base_addr); +static blt_bool ExtFlashAddToBlock(tFlashBlockInfo *block, blt_addr address, + blt_int8u *data, blt_int16u len); +static blt_bool ExtFlashWriteBlock(tFlashBlockInfo *block); +static blt_bool ExtFlashEraseSector(blt_addr sector_base); +static blt_int16u ExtFlashGetDeviceInfo(blt_addr block_base, blt_int16u info); +static void ExtFlashLockSector(blt_addr sector_base); +static void ExtFlashUnlockSector(blt_addr sector_base); +static blt_int8u ExtFlashGetSector(blt_addr address); + + +/**************************************************************************************** +* Local constant declarations +****************************************************************************************/ +/* The current layout supports the 2MB external C3 Intel flash: + * - manufacturer id = 0x0089 + * - device id = 0x88c3 (16 Mbit bottom boot device) + * Note that what Intel calls a block in the user manual, is called a sector in this + * driver. + */ +static const tFlashSector flashLayout[] = +{ + { 0x80000000, 0x02000, 0}, /* flash sector 0 - 8 kbyte */ + { 0x80002000, 0x02000, 1}, /* flash sector 1 - 8 kbyte */ + { 0x80004000, 0x02000, 2}, /* flash sector 2 - 8 kbyte */ + { 0x80006000, 0x02000, 3}, /* flash sector 3 - 8 kbyte */ + { 0x80008000, 0x02000, 4}, /* flash sector 4 - 8 kbyte */ + { 0x8000A000, 0x02000, 5}, /* flash sector 5 - 8 kbyte */ + { 0x8000C000, 0x02000, 6}, /* flash sector 6 - 8 kbyte */ + { 0x8000E000, 0x02000, 7}, /* flash sector 7 - 8 kbyte */ + { 0x80010000, 0x10000, 8}, /* flash sector 8 - 64 kbyte */ + { 0x80020000, 0x10000, 9}, /* flash sector 9 - 64 kbyte */ + { 0x80030000, 0x10000, 10}, /* flash sector 10 - 64 kbyte */ + { 0x80040000, 0x10000, 11}, /* flash sector 11 - 64 kbyte */ + { 0x80050000, 0x10000, 12}, /* flash sector 12 - 64 kbyte */ + { 0x80060000, 0x10000, 13}, /* flash sector 13 - 64 kbyte */ + { 0x80070000, 0x10000, 14}, /* flash sector 14 - 64 kbyte */ + { 0x80080000, 0x10000, 15}, /* flash sector 15 - 64 kbyte */ + { 0x80090000, 0x10000, 16}, /* flash sector 16 - 64 kbyte */ + { 0x800A0000, 0x10000, 17}, /* flash sector 17 - 64 kbyte */ + { 0x800B0000, 0x10000, 18}, /* flash sector 18 - 64 kbyte */ + { 0x800C0000, 0x10000, 19}, /* flash sector 19 - 64 kbyte */ + { 0x800D0000, 0x10000, 20}, /* flash sector 20 - 64 kbyte */ + { 0x800E0000, 0x10000, 21}, /* flash sector 21 - 64 kbyte */ + { 0x800F0000, 0x10000, 22}, /* flash sector 22 - 64 kbyte */ + { 0x80100000, 0x10000, 23}, /* flash sector 23 - 64 kbyte */ + { 0x80110000, 0x10000, 24}, /* flash sector 24 - 64 kbyte */ + { 0x80120000, 0x10000, 25}, /* flash sector 25 - 64 kbyte */ + { 0x80130000, 0x10000, 26}, /* flash sector 26 - 64 kbyte */ + { 0x80140000, 0x10000, 27}, /* flash sector 27 - 64 kbyte */ + { 0x80150000, 0x10000, 28}, /* flash sector 28 - 64 kbyte */ + { 0x80160000, 0x10000, 29}, /* flash sector 29 - 64 kbyte */ + { 0x80170000, 0x10000, 30}, /* flash sector 30 - 64 kbyte */ + { 0x80180000, 0x10000, 31}, /* flash sector 31 - 64 kbyte */ + { 0x80190000, 0x10000, 32}, /* flash sector 32 - 64 kbyte */ + { 0x801A0000, 0x10000, 33}, /* flash sector 33 - 64 kbyte */ + { 0x801B0000, 0x10000, 34}, /* flash sector 34 - 64 kbyte */ + { 0x801C0000, 0x10000, 35}, /* flash sector 35 - 64 kbyte */ + { 0x801D0000, 0x10000, 36}, /* flash sector 36 - 64 kbyte */ + { 0x801E0000, 0x10000, 37}, /* flash sector 37 - 64 kbyte */ + { 0x801F0000, 0x10000, 38} /* flash sector 38 - 64 kbyte */ +}; + + +/**************************************************************************************** +* Local data declarations +****************************************************************************************/ +/* The smallest amount of flash that can be programmed is FLASH_WRITE_BLOCK_SIZE. A flash + * block manager is implemented in this driver and stores info in this variable. Whenever + * new data should be flashed, it is first added to a RAM buffer, which is part of this + * variable. Whenever the RAM buffer, which has the size of a flash block, is full or + * data needs to be written to a different block, the contents of the RAM buffer are + * programmed to flash. The flash block manager requires some software overhead, yet + * results is faster flash programming because data is first harvested, ideally until + * there is enough to program an entire flash block, before the flash device is actually + * operated on. + */ +static tFlashBlockInfo blockInfo; + + +/**************************************************************************************** +** NAME: ExtFlashInit +** PARAMETER: none +** RETURN VALUE: none +** DESCRIPTION: Initializes the flash driver. +** +****************************************************************************************/ +void ExtFlashInit(void) +{ + /* init the flash block info struct by setting the address to an invalid address */ + blockInfo.base_addr = FLASH_INVALID_ADDRESS; + /* check the flash device identification */ + if ((ExtFlashGetManID() != FLASH_DEV_MAN_ID) || (ExtFlashGetDevID() != FLASH_DEV_ID)) + { + ASSERT_RT(BLT_FALSE); + } +} /*** end of ExtFlashInit ***/ + + +/**************************************************************************************** +** NAME: ExtFlashWrite +** PARAMETER: addr start address +** len length in bytes +** data pointer to the data buffer. +** RETURN VALUE: BLT_NVM_OKAY if successful, BLT_NVM_NOT_IN_RANGE if the address is +** not within the supported memory range, or BLT_NVM_ERROR is the write +** operation failed. +** DESCRIPTION: Writes the data to flash. +** +****************************************************************************************/ +blt_int8u ExtFlashWrite(blt_addr addr, blt_int32u len, blt_int8u *data) +{ + /* make sure the addresses are within the flash device */ + if ( (ExtFlashGetSector(addr) == FLASH_INVALID_SECTOR) || \ + (ExtFlashGetSector(addr+len-1) == FLASH_INVALID_SECTOR) ) + { + return BLT_NVM_NOT_IN_RANGE; + } + + /* let the block manager handle it */ + if (ExtFlashAddToBlock(&blockInfo, addr, data, len) == BLT_FALSE) + { + return BLT_NVM_ERROR; + } + return BLT_NVM_OKAY; +} /*** end of FlashWrite ***/ + + +/**************************************************************************************** +** NAME: ExtFlashErase +** PARAMETER: addr start address +** len length in bytes +** RETURN VALUE: BLT_NVM_OKAY if successful, BLT_NVM_NOT_IN_RANGE if the address is +** not within the supported memory range, or BLT_NVM_ERROR is the erase +** operation failed. +** DESCRIPTION: Erases the flash memory. Note that this function also checks that no +** data is erased outside the flash memory region. +** +****************************************************************************************/ +blt_int8u ExtFlashErase(blt_addr addr, blt_int32u len) +{ + blt_int8u first_sector; + blt_int8u last_sector; + blt_int8u sectorIdx; + + /* obtain the first and last sector number */ + first_sector = ExtFlashGetSector(addr); + last_sector = ExtFlashGetSector(addr+len-1); + /* check them */ + if ( (first_sector == FLASH_INVALID_SECTOR) || (last_sector == FLASH_INVALID_SECTOR) ) + { + return BLT_NVM_NOT_IN_RANGE; + } + /* erase the sectors one-by-one */ + for (sectorIdx = first_sector; sectorIdx <= last_sector; sectorIdx++) + { + /* keep the watchdog happy */ + CopService(); + /* erase the sector */ + if (ExtFlashEraseSector(flashLayout[sectorIdx].sector_start) == BLT_FALSE) + { + return BLT_NVM_ERROR; + } + } + /* done so return the result of the operation */ + return BLT_NVM_OKAY; +} /*** end of ExtFlashErase ***/ + + +/**************************************************************************************** +** NAME: ExtFlashDone +** PARAMETER: none +** RETURN VALUE: BLT_TRUE is succesful, BLT_FALSE otherwise. +** DESCRIPTION: Finilizes the flash driver operations. +** +****************************************************************************************/ +blt_bool ExtFlashDone(void) +{ + /* check if there is still data waiting to be programmed */ + if (blockInfo.base_addr != FLASH_INVALID_ADDRESS) + { + if (ExtFlashWriteBlock(&blockInfo) == BLT_FALSE) + { + return BLT_FALSE; + } + } + /* still here so all is okay */ + return BLT_TRUE; +} /*** end of ExtFlashDone ***/ + + +/**************************************************************************************** +** NAME: ExtFlashInitBlock +** PARAMETER: block pointer to flash block info structure to operate on. +** address base address of the block data. +** RETURN VALUE: BLT_TRUE is succesful, BLT_FALSE otherwise. +** DESCRIPTION: Copies data currently in flash to the block->data and sets the +** base address. +** +****************************************************************************************/ +static blt_bool ExtFlashInitBlock(tFlashBlockInfo *block, blt_addr address) +{ + /* check address alignment */ + if ((address % FLASH_WRITE_BLOCK_SIZE) != 0) + { + return BLT_FALSE; + } + /* make sure that we are initializing a new block and not the same one */ + if (block->base_addr == address) + { + /* block already initialized, so nothing to do */ + return BLT_TRUE; + } + /* set the base address and copies the current data from flash */ + block->base_addr = address; + CpuMemCopy((blt_addr)block->data, address, FLASH_WRITE_BLOCK_SIZE); + return BLT_TRUE; +} /*** end of ExtFlashInitBlock ***/ + + +/**************************************************************************************** +** NAME: ExtFlashSwitchBlock +** PARAMETER: block pointer to flash block info structure to operate on. +** base_addr base address for the next block +** RETURN VALUE: the pointer of the block info struct that is no being used, or a NULL +** pointer in case of error. +** DESCRIPTION: Switches blocks by programming the current one and initializing the +** next. +** +****************************************************************************************/ +static tFlashBlockInfo *ExtFlashSwitchBlock(tFlashBlockInfo *block, blt_addr base_addr) +{ + /* need to switch to a new block, so program the current one and init the next */ + if (ExtFlashWriteBlock(block) == BLT_FALSE) + { + return BLT_NULL; + } + /* initialize the new block when necessary */ + if (ExtFlashInitBlock(block, base_addr) == BLT_FALSE) + { + return BLT_NULL; + } + /* still here to all is okay */ + return block; +} /*** end of ExtFlashSwitchBlock ***/ + + +/**************************************************************************************** +** NAME: ExtFlashAddToBlock +** PARAMETER: block pointer to flash block info structure to operate on. +** address flash destination address +** data pointer to the byte array with data +** len number of bytes to add to the block +** RETURN VALUE: BLT_TRUE if successful, BLT_FALSE otherwise. +** DESCRIPTION: Programming is done per block. This function adds data to the block +** that is currently collecting data to be written to flash. If the +** address is outside of the current block, the current block is written +** to flash an a new block is initialized. +** +****************************************************************************************/ +static blt_bool ExtFlashAddToBlock(tFlashBlockInfo *block, blt_addr address, + blt_int8u *data, blt_int16u len) +{ + blt_addr current_base_addr; + blt_int8u *dst; + blt_int8u *src; + + /* determine the current base address */ + current_base_addr = (address/FLASH_WRITE_BLOCK_SIZE)*FLASH_WRITE_BLOCK_SIZE; + + /* make sure the blockInfo is not uninitialized */ + if (block->base_addr == FLASH_INVALID_ADDRESS) + { + /* initialize the blockInfo struct for the current block */ + if (ExtFlashInitBlock(block, current_base_addr) == BLT_FALSE) + { + return BLT_FALSE; + } + } + /* check if the new data fits in the current block */ + if (block->base_addr != current_base_addr) + { + /* need to switch to a new block, so program the current one and init the next */ + block = ExtFlashSwitchBlock(block, current_base_addr); + if (block == BLT_NULL) + { + return BLT_FALSE; + } + } + /* add the data to the current block, but check for block overflow */ + dst = &(block->data[address - block->base_addr]); + src = data; + do + { + /* keep the watchdog happy */ + CopService(); + /* buffer overflow? */ + if ((blt_addr)(dst-&(block->data[0])) >= FLASH_WRITE_BLOCK_SIZE) + { + /* need to switch to a new block, so program the current one and init the next */ + block = ExtFlashSwitchBlock(block, current_base_addr+FLASH_WRITE_BLOCK_SIZE); + if (block == BLT_NULL) + { + return BLT_FALSE; + } + /* reset destination pointer */ + dst = &(block->data[0]); + } + /* write the data to the buffer */ + *dst = *src; + /* update pointers */ + dst++; + src++; + /* decrement byte counter */ + len--; + } + while (len > 0); + /* still here so all is good */ + return BLT_TRUE; +} /*** end of ExtFlashAddToBlock ***/ + + +/**************************************************************************************** +** NAME: ExtFlashWriteBlock +** PARAMETER: block pointer to flash block info structure to operate on. +** RETURN VALUE: BLT_TRUE if successful, BLT_FALSE otherwise. +** DESCRIPTION: Programs FLASH_WRITE_BLOCK_SIZE bytes to flash from the block->data +** array. +** +****************************************************************************************/ +static blt_bool ExtFlashWriteBlock(tFlashBlockInfo *block) +{ + volatile blt_int16u *pAddr; + volatile blt_int16u *pData; + blt_bool result = BLT_TRUE; + volatile blt_int32u timeout = 0; + + /* unlock the sector */ + ExtFlashUnlockSector(block->base_addr); + /* init pointer to valid address in the flash block */ + pAddr = (blt_int16u *)block->base_addr; + /* init pointer to start of block data */ + pData = (blt_int16u *)block->data; + /* program all block data 16-bits at a time */ + while ((blt_addr)pAddr < (block->base_addr+FLASH_WRITE_BLOCK_SIZE)) + { + /* keep the watchdog happy */ + CopService(); + /* issue program setup command */ + *pAddr = FLASH_CMD_PROGRAM_MODE; + /* write 16-bit data that is to be programmed to start programming operation */ + *pAddr = *pData; + /* check status register for completion */ + *pAddr = FLASH_CMD_READ_STATUS_MODE; + /* wait for completion or timeout */ + while( ((*pAddr & FLASH_STATUS_READY_BIT) == 0) && (timeout < FLASH_PROGRAM_TIMEOUT) ) + { + timeout++; + } + /* check for possible errors */ + if ( (timeout >= FLASH_ERASE_TIMEOUT) || \ + ((*pAddr & (FLASH_ERR_LOCKED | FLASH_ERR_VPP_RANGE | FLASH_ERR_PROGRAM))!= 0) ) + { + result = BLT_FALSE; + } + /* clear the status register */ + *pAddr = FLASH_CMD_CLEAR_STATUS; + /* increment address and data pointers */ + pAddr++; + pData++; + } + /* lock the sector. this also switches back to read array mode */ + ExtFlashLockSector(block->base_addr); + /* inform the caller about the result */ + return result; +} /*** end of ExtFlashWriteBlock ***/ + + +/**************************************************************************************** +** NAME: ExtFlashEraseSector +** PARAMETER: sector_base base address of the sector to erase. +** RETURN VALUE: BLT_TRUE is erasure was successful, BLT_FALSE otherwise. +** DESCRIPTION: Erases the flash sector. +** +****************************************************************************************/ +static blt_bool ExtFlashEraseSector(blt_addr sector_base) +{ + volatile blt_int16u *pAddr; + blt_bool result = BLT_TRUE; + volatile blt_int32u timeout = 0; + + /* unlock the sector */ + ExtFlashUnlockSector(sector_base); + /* init pointer to valid address in the flash sector */ + pAddr = (blt_int16u *)sector_base; + /* issue erase setup command */ + *pAddr = FLASH_CMD_ERASE_MODE; + /* issue erase confirm command */ + *pAddr = FLASH_CMD_ERASE_CONFIRM; + /* check status register for completion */ + *pAddr = FLASH_CMD_READ_STATUS_MODE; + /* wait for completion or timeout */ + while( ((*pAddr & FLASH_STATUS_READY_BIT) == 0) && (timeout < FLASH_ERASE_TIMEOUT) ) + { + timeout++; + } + /* check for possible errors */ + if ( (timeout >= FLASH_ERASE_TIMEOUT) || \ + ((*pAddr & (FLASH_ERR_LOCKED | FLASH_ERR_VPP_RANGE | FLASH_ERR_ERASE))!= 0) ) + { + result = BLT_FALSE; + } + /* clear the status register */ + *pAddr = FLASH_CMD_CLEAR_STATUS; + /* lock the sector. this also switches back to read array mode */ + ExtFlashLockSector(sector_base); + /* inform the caller about the result */ + return result; +} /*** end of ExtFlashEraseSector ***/ + + +/**************************************************************************************** +** NAME: ExtFlashLockSector +** PARAMETER: sector_base base address of the sector to lock. +** RETURN VALUE: none +** DESCRIPTION: Locks the flash sector. +** +****************************************************************************************/ +static void ExtFlashLockSector(blt_addr sector_base) +{ + volatile blt_int16u *pAddr; + + /* no need to lock a sector that is already locked */ + if ((ExtFlashGetLockStatus(sector_base) & FLASH_LOCK_BIT) != 0) + { + return; + } + /* init pointer to valid address in the flash sector */ + pAddr = (blt_int16u *)sector_base; + /* switch to change lock mode */ + *pAddr = FLASH_CMD_CHANGE_LOCK_MODE; + /* unlock the sector */ + *pAddr = FLASH_CMD_LOCK_SECTOR; + /* check that the sector is now actually locked */ + ASSERT_RT((ExtFlashGetLockStatus(sector_base) & FLASH_LOCK_BIT) != 0); +} /*** end of ExtFlashLockSector ***/ + + +/**************************************************************************************** +** NAME: ExtFlashUnlockSector +** PARAMETER: sector_base base address of the sector to unlock. +** RETURN VALUE: none +** DESCRIPTION: Unlocks the flash sector. +** +****************************************************************************************/ +static void ExtFlashUnlockSector(blt_addr sector_base) +{ + volatile blt_int16u *pAddr; + + /* no need to unlock a sector that is already unlocked */ + if ((ExtFlashGetLockStatus(sector_base) & FLASH_LOCK_BIT) == 0) + { + return; + } + /* init pointer to valid address in the flash sector */ + pAddr = (blt_int16u *)sector_base; + /* switch to change lock mode */ + *pAddr = FLASH_CMD_CHANGE_LOCK_MODE; + /* unlock the sector */ + *pAddr = FLASH_CMD_UNLOCK_SECTOR; + /* check that the sector is now actually unlocked */ + ASSERT_RT((ExtFlashGetLockStatus(sector_base) & FLASH_LOCK_BIT) == 0); +} /*** end of ExtFlashUnlockSector ***/ + + +/**************************************************************************************** +** NAME: ExtFlashGetDeviceInfo +** PARAMETER: sector_base base address of the sector to get the info from. +** info identifier to the type of info to obtain. +** RETURN VALUE: device info. +** DESCRIPTION: Obtains device information from the flash device. +** +****************************************************************************************/ +static blt_int16u ExtFlashGetDeviceInfo(blt_addr sector_base, blt_int16u info) +{ + volatile blt_int16u *pAddr; + blt_int16u readData; + + /* init pointer to any valid address in the flash device */ + pAddr = (blt_int16u *)sector_base + info; + /* switch to read identifier mode */ + *pAddr = FLASH_CMD_READ_ID_MODE; + /* read the info */ + readData = *pAddr; + /* switch back to reading mode */ + *pAddr = FLASH_CMD_READ_ARRAY_MODE; + /* return the result */ + return readData; +} /*** end of ExtFlashGetDeviceInfo ***/ + + +/**************************************************************************************** +** NAME: ExtFlashGetSector +** PARAMETER: address address in the flash sector +** RETURN VALUE: flash sector number or FLASH_INVALID_SECTOR +** DESCRIPTION: Determines the flash sector the address is in. +** +****************************************************************************************/ +static blt_int8u ExtFlashGetSector(blt_addr address) +{ + blt_int8u sectorIdx; + + /* search through the sectors to find the right one */ + for (sectorIdx = 0; sectorIdx < FLASH_TOTAL_SECTORS; sectorIdx++) + { + /* keep the watchdog happy */ + CopService(); + /* is the address in this sector? */ + if ( (address >= flashLayout[sectorIdx].sector_start) && \ + (address < (flashLayout[sectorIdx].sector_start + \ + flashLayout[sectorIdx].sector_size)) ) + { + /* return the sector number */ + return flashLayout[sectorIdx].sector_num; + } + } + /* still here so no valid sector found */ + return FLASH_INVALID_SECTOR; +} /*** end of ExtFlashGetSector ***/ +#endif + +/*********************************** end of extflash.c *********************************/ diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/extflash.h b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/extflash.h new file mode 100644 index 00000000..bc8c4b15 --- /dev/null +++ b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/extflash.h @@ -0,0 +1,45 @@ +/**************************************************************************************** +| Description: bootloader external flash driver header file +| File Name: extflash.h +| +|---------------------------------------------------------------------------------------- +| C O P Y R I G H T +|---------------------------------------------------------------------------------------- +| Copyright (c) 2011 by Feaser http://www.feaser.com All rights reserved +| +|---------------------------------------------------------------------------------------- +| L I C E N S E +|---------------------------------------------------------------------------------------- +| This file is part of OpenBLT. OpenBLT 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. +| +| OpenBLT 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 OpenBLT. +| If not, see . +| +| A special exception to the GPL is included to allow you to distribute a combined work +| that includes OpenBLT without being obliged to provide the source code for any +| proprietary components. The exception text is included at the bottom of the license +| file . +| +****************************************************************************************/ +#ifndef EXTFLASH_H +#define EXTFLASH_H + +#if (BOOT_NVM_HOOKS_ENABLE > 0) +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +void ExtFlashInit(void); +blt_int8u ExtFlashWrite(blt_addr addr, blt_int32u len, blt_int8u *data); +blt_int8u ExtFlashErase(blt_addr addr, blt_int32u len); +blt_bool ExtFlashDone(void); +#endif + +#endif /* EXTFLASH_H */ +/*********************************** end of extflash.h *********************************/ diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/hooks.c b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/hooks.c index e46906ec..8bbaedb6 100644 --- a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/hooks.c +++ b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/hooks.c @@ -80,6 +80,7 @@ blt_bool BackDoorEntryHook(void) ****************************************************************************************/ #if (BOOT_NVM_HOOKS_ENABLE > 0) +#include "extflash.h" /**************************************************************************************** ** NAME: NvmInitHook ** PARAMETER: none @@ -90,6 +91,8 @@ blt_bool BackDoorEntryHook(void) ****************************************************************************************/ void NvmInitHook(void) { + /* init the external flash driver */ + ExtFlashInit(); } /*** end of NvmInitHook ***/ @@ -98,20 +101,21 @@ void NvmInitHook(void) ** PARAMETER: addr start address ** len length in bytes ** data pointer to the data buffer. -** RETURN VALUE: BTL_NVM_OKAY if successful, BTL_NVM_NOT_IN_RANGE if the address is -** not within the supported memory range, or BTL_NVM_ERROR is the write +** RETURN VALUE: BLT_NVM_OKAY if successful, BLT_NVM_NOT_IN_RANGE if the address is +** not within the supported memory range, or BLT_NVM_ERROR is the write ** operation failed. ** DESCRIPTION: Callback that gets called at the start of the NVM driver write ** routine. It allows additional memory to be operated on. If the address ** is not within the range of the additional memory, then -** BTL_NVM_NOT_IN_RANGE must be returned to indicate that the data hasn't +** BLT_NVM_NOT_IN_RANGE must be returned to indicate that the data hasn't ** been written yet. ** ** ****************************************************************************************/ blt_int8u NvmWriteHook(blt_addr addr, blt_int32u len, blt_int8u *data) { - return BTL_NVM_NOT_IN_RANGE; + /* attempt to write with the external flash driver */ + return ExtFlashWrite(addr, len, data); } /*** end of NvmWriteHook ***/ @@ -119,19 +123,20 @@ blt_int8u NvmWriteHook(blt_addr addr, blt_int32u len, blt_int8u *data) ** NAME: NvmEraseHook ** PARAMETER: addr start address ** len length in bytes -** RETURN VALUE: BTL_NVM_OKAY if successful, BTL_NVM_NOT_IN_RANGE if the address is -** not within the supported memory range, or BTL_NVM_ERROR is the erase +** RETURN VALUE: BLT_NVM_OKAY if successful, BLT_NVM_NOT_IN_RANGE if the address is +** not within the supported memory range, or BLT_NVM_ERROR is the erase ** operation failed. ** DESCRIPTION: Callback that gets called at the start of the NVM driver erase ** routine. It allows additional memory to be operated on. If the address ** is not within the range of the additional memory, then -** BTL_NVM_NOT_IN_RANGE must be returned to indicate that the memory +** BLT_NVM_NOT_IN_RANGE must be returned to indicate that the memory ** hasn't been erased yet. ** ****************************************************************************************/ -blt_bool NvmEraseHook(blt_addr addr, blt_int32u len) +blt_int8u NvmEraseHook(blt_addr addr, blt_int32u len) { - return BTL_NVM_NOT_IN_RANGE; + /* attempt to erase with the external flash driver */ + return ExtFlashErase(addr, len); } /*** end of NvmEraseHook ***/ @@ -144,7 +149,8 @@ blt_bool NvmEraseHook(blt_addr addr, blt_int32u len) ****************************************************************************************/ blt_bool NvmDoneHook(void) { - return BLT_TRUE; + /* finish up the operations of the external flash driver */ + return ExtFlashDone(); } /*** end of NvmDoneHook ***/ #endif /* BOOT_NVM_HOOKS_ENABLE > 0 */ diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/ide/lpc2294_crossworks.hzp b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/ide/lpc2294_crossworks.hzp index cfbf6ba6..a36735fc 100644 --- a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/ide/lpc2294_crossworks.hzp +++ b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/ide/lpc2294_crossworks.hzp @@ -1,7 +1,7 @@ - + @@ -12,6 +12,8 @@ + + diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/ide/lpc2294_crossworks.hzs b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/ide/lpc2294_crossworks.hzs index d6c8b5dd..ff30c1df 100644 --- a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/ide/lpc2294_crossworks.hzs +++ b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/ide/lpc2294_crossworks.hzs @@ -9,7 +9,7 @@ - + @@ -55,6 +55,9 @@ - + + + + diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/lpc2294.h b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/lpc2294.h index 209015fb..b9d6766d 100644 --- a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/lpc2294.h +++ b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/lpc2294.h @@ -35,7 +35,7 @@ /**************************************************************************************** * Macro definitions ****************************************************************************************/ -/* EXTERNAL MEMORY CONTROLLER (EMC) */ +/* EXTERNAL MEMORY CONTROLLER (EMC) */ #define BCFG0 (*((volatile unsigned long *) 0xFFE00000)) /* lpc22xx only */ #define BCFG1 (*((volatile unsigned long *) 0xFFE00004)) /* lpc22xx only */ #define BCFG2 (*((volatile unsigned long *) 0xFFE00008)) /* lpc22xx only */ diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/main.c b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/main.c index fcd404b2..9452a520 100644 --- a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/main.c +++ b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/main.c @@ -144,6 +144,29 @@ static void Init(void) MAMCR = 0x2; /* setting peripheral Clock (pclk) to System Clock (cclk) */ VPBDIV = 0x1; +#if (BOOT_NVM_HOOKS_ENABLE > 0) + /* in this the external memory on the Olimex LPC-L2294 board is used so configure + * the memory banks for the external flash EEPROM and RAM + */ + /* external flash EEPROM: + * IDCY=3 (idle timing) + * WST1=4 (read timing) + * RBLE=1 + * WST2=6 (write timing) + * MW=1 (16-bit data bus) + */ + BCFG0 = (0x3 << 0) | (0x4 << 5) | (0x1 << 10) | (0x6 << 11) | (0x1 << 28); + /* external RAM: + * IDCY=0 (idle timing) + * WST1=0 (read timing) + * RBLE=1 + * WST2=0 (write timing) + * MW=2 (32-bit data bus) + */ + BCFG1 = (0x0 << 0) | (0x0 << 5) | (0x1 << 10) | (0x0 << 11) | (0x2 << 28); + /* configure use of data bus and strobe pins for the external memory */ + PINSEL2 = 0x0F000924; +#endif #if (BOOT_COM_UART_ENABLE > 0) /* configure P0.0 for UART0 Tx and P0.1 for UART0 Rx functionality */ PINSEL0 |= 0x05; diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Prog/bin/demoprog_olimex_lpc_l2294_20mhz.elf b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Prog/bin/demoprog_olimex_lpc_l2294_20mhz.elf index acbbbf4cccfc2279dd67a8e3e28b8f0389fc5add..b034dc13f0cac93bbbcd97b536ac2e0385d22f8e 100644 GIT binary patch delta 1031 zcmZ9LPiPZS5XR?ayZ#}m4W=h4?bcM1s=-S|p|%#RwbVpBl!}*Pz|yJ_kp>NlBt;P~ zLhCb z%Zm|lMyf_cOvsoKQ8PMGqZA7vnKFWE$sl?rr;MgW z0kZ4o5Vs5TKv1b?^ANb;X=s$=L^wWM3(;!9?eq!U6((AP0pGwHxaBCjISpnv*+64-4njNdrn_C%z`0I` z*&qU5@2$og=ujP-Rvi4JtExAx5wQ20x&n3^G_%$%9F(F&9mwGVcUcgtPGDLRj8(hR z7hvxMCDzy8bQ^sEdke0B`7e2=;{OMXf%~xIhQp@iZ}LuLTCHI3M|VK)S(^0+k7v>Y VspRCu@YrO!KbcPI%ikU={{Rl_)64(> delta 989 zcmZ9LPiWI{6vyAMS;W%J4L3ZEEwj_Ex*fy{N<|AY@lPuXV_FdLAc`<{5OjivRGmkm z<7a0;94d&rh)RS-r|4k^@vzg}U<_1H5cFU!vWbv=Ut*f1Jv{RHz3=vwQFS-|sA}3dhod*WRzb!=HGDNKjq6s2WcPT_-h#wQ$4Upqcj;8G$@W?snq+HTV%|DjJJ)4Bf2k?rfqXli7FGFm zIwOW;($0tratGq5EZZ6NjZIXQx9qf9oFnSDp4zJ^QLvuO-d<ys|IIH__G@J8mAloD1}h zI{=RUr_O-G0UdW3{Jxi{2PN<~=rRlXgAE+_1{lBkE4>4bZt#rt^*dcp@4(T9pTPX( mjrk4eGZ-5e5WOq=3l0}*bKK?@7)Au0)`_`?DN9+pr>p@oo5*qi diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Prog/bin/demoprog_olimex_lpc_l2294_20mhz.map b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Prog/bin/demoprog_olimex_lpc_l2294_20mhz.map index 0c1b218b..b107bef2 100644 --- a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Prog/bin/demoprog_olimex_lpc_l2294_20mhz.map +++ b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Prog/bin/demoprog_olimex_lpc_l2294_20mhz.map @@ -785,7 +785,7 @@ VPB_Peripherals 0xe0000000 0x00200000 xw BANK3 0x83000000 0x01000000 xw BANK2 0x82000000 0x01000000 xw External_SRAM 0x81000000 0x00100000 xw -External_FLASH 0x80000000 0x00400000 xr +External_FLASH 0x80000000 0x00200000 xr SRAM 0x40000200 0x00003ce0 xw FLASH 0x00002000 0x0003e000 xr *default* 0x00000000 0xffffffff @@ -806,7 +806,7 @@ Linker script and memory map 0x81000000 __External_SRAM_segment_start__ = 0x81000000 0x81100000 __External_SRAM_segment_end__ = 0x81100000 0x80000000 __External_FLASH_segment_start__ = 0x80000000 - 0x80400000 __External_FLASH_segment_end__ = 0x80400000 + 0x80200000 __External_FLASH_segment_end__ = 0x80200000 0x40002000 __SRAM_segment_start__ = 0x40002000 0x40003ee0 __SRAM_segment_end__ = 0x40003ee0 0x00002000 __FLASH_segment_start__ = 0x2000 @@ -1310,20 +1310,20 @@ OUTPUT(D:/usr/feaser/software/OpenBLT/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_ .debug_ranges 0x000007e0 0x50 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libc_user_libc_v4t_a_le.a(user_libc.o) .debug_ranges 0x00000830 0x10 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libarm_v4t_a_le.a(libarm_run_dcc_port_server.o) -.debug_line 0x00000000 0x12a0 +.debug_line 0x00000000 0x12a1 .debug_line 0x00000000 0xec ARM Flash Debug/../../obj/boot.o .debug_line 0x000000ec 0x11e ARM Flash Debug/../../obj/cstart.o .debug_line 0x0000020a 0xe8 ARM Flash Debug/../../obj/irq.o .debug_line 0x000002f2 0xb6 ARM Flash Debug/../../obj/led.o - .debug_line 0x000003a8 0xe9 ARM Flash Debug/../../obj/main.o - .debug_line 0x00000491 0xd5 ARM Flash Debug/../../obj/timer.o - .debug_line 0x00000566 0x9d ARM Flash Debug/../../obj/vectors.o - .debug_line 0x00000603 0x75 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libc_v4t_a_le.a(__vfprintf_int.o) - .debug_line 0x00000678 0x74 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libc_v4t_a_le.a(__vfscanf_int.o) - .debug_line 0x000006ec 0x54f C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libc_v4t_a_le.a(libc2.o) - .debug_line 0x00000c3b 0x56a C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libdebugio_v4t_a_le.a(libdebugio.o) - .debug_line 0x000011a5 0x74 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libc_user_libc_v4t_a_le.a(user_libc.o) - .debug_line 0x00001219 0x87 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libarm_v4t_a_le.a(libarm_run_dcc_port_server.o) + .debug_line 0x000003a8 0xea ARM Flash Debug/../../obj/main.o + .debug_line 0x00000492 0xd5 ARM Flash Debug/../../obj/timer.o + .debug_line 0x00000567 0x9d ARM Flash Debug/../../obj/vectors.o + .debug_line 0x00000604 0x75 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libc_v4t_a_le.a(__vfprintf_int.o) + .debug_line 0x00000679 0x74 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libc_v4t_a_le.a(__vfscanf_int.o) + .debug_line 0x000006ed 0x54f C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libc_v4t_a_le.a(libc2.o) + .debug_line 0x00000c3c 0x56a C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libdebugio_v4t_a_le.a(libdebugio.o) + .debug_line 0x000011a6 0x74 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libc_user_libc_v4t_a_le.a(user_libc.o) + .debug_line 0x0000121a 0x87 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libarm_v4t_a_le.a(libarm_run_dcc_port_server.o) .debug_str 0x00000000 0xfc6 .debug_str 0x00000000 0x132 ARM Flash Debug/../../obj/boot.o diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Prog/ide/lpc2294_crossworks.hzp b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Prog/ide/lpc2294_crossworks.hzp index d502c976..4712f430 100644 --- a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Prog/ide/lpc2294_crossworks.hzp +++ b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Prog/ide/lpc2294_crossworks.hzp @@ -1,7 +1,7 @@ - + diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Prog/ide/lpc2294_crossworks.hzs b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Prog/ide/lpc2294_crossworks.hzs index aeea24ef..76b2d7cb 100644 --- a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Prog/ide/lpc2294_crossworks.hzs +++ b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Prog/ide/lpc2294_crossworks.hzs @@ -55,6 +55,9 @@ - + + + + diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Prog/main.c b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Prog/main.c index 59f19aa4..a5411907 100644 --- a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Prog/main.c +++ b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Prog/main.c @@ -41,6 +41,25 @@ static void Init(void); +/**************************************************************************************** +* Constant data declarations +****************************************************************************************/ +#if (BOOT_NVM_HOOKS_ENABLE > 0) +/* ROM data allocated to the external flash on the Olimex LPC-L2294 board to test the + * programming of data in external flash. To test programming with the additional + * external flash driver, build the bootloader and this program with configurable + * BOOT_NVM_HOOKS_ENABLE set to 1 in config.h + */ +__attribute__((section (".rodata2"))) const unsigned long ExtFlashTestData[] = +{ + 0x00000000, 0x11111111, 0x22222222, 0x33333333, + 0x44444444, 0x55555555, 0x66666666, 0x77777777, + 0x88888888, 0x99999999, 0xAAAAAAAA, 0xBBBBBBBB, + 0xCCCCCCCC, 0xDDDDDDDD, 0xEEEEEEEE, 0xFFFFFFFF +}; +#endif + + /**************************************************************************************** ** NAME: main ** PARAMETER: none diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Prog/memory.x b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Prog/memory.x index cb5d5a1c..70cbf672 100644 --- a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Prog/memory.x +++ b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Prog/memory.x @@ -6,7 +6,7 @@ MEMORY BANK3 (wx) : ORIGIN = 0x83000000, LENGTH = 0x01000000 BANK2 (wx) : ORIGIN = 0x82000000, LENGTH = 0x01000000 External_SRAM (wx) : ORIGIN = 0x81000000, LENGTH = 0x00100000 - External_FLASH (rx) : ORIGIN = 0x80000000, LENGTH = 0x00400000 + External_FLASH (rx) : ORIGIN = 0x80000000, LENGTH = 0x00200000 SRAM (wx) : ORIGIN = 0x40000200, LENGTH = 0x00003CE0 FLASH (rx) : ORIGIN = 0x00002000, LENGTH = 0x0003E000 } @@ -25,7 +25,7 @@ SECTIONS __External_SRAM_segment_start__ = 0x81000000; __External_SRAM_segment_end__ = 0x81100000; __External_FLASH_segment_start__ = 0x80000000; - __External_FLASH_segment_end__ = 0x80400000; + __External_FLASH_segment_end__ = 0x80200000; __SRAM_segment_start__ = 0x40002000; __SRAM_segment_end__ = 0x40003EE0; __FLASH_segment_start__ = 0x00002000; diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/bin/openbtl_olimex_lpc_l2294_20mhz.elf b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/bin/openbtl_olimex_lpc_l2294_20mhz.elf index d34a1d0902a7933ca6776c515f4a3a2c81502b1a..50b977eb8b1ee59f2bda8627cf32aa0c7cac701a 100644 GIT binary patch literal 64225 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 literal 65005 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 diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/bin/openbtl_olimex_lpc_l2294_20mhz.hex b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/bin/openbtl_olimex_lpc_l2294_20mhz.hex index 5adf7246..823edf49 100644 --- a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/bin/openbtl_olimex_lpc_l2294_20mhz.hex +++ b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/bin/openbtl_olimex_lpc_l2294_20mhz.hex @@ -1,7 +1,7 @@ :1000000018F09FE518F09FE518F09FE518F09FE5C0 :1000100018F09FE50000A0E118F09FE510F09FE5C3 -:100020005000000040150000A00000004015000036 -:1000300040150000F014000018150000000000003A +:10002000500000009C120000A00000009C12000084 +:100030009C1200006412000080120000000000000A :10004000E4009FE50110A0E3001080E5000000EF50 :10005000D8009FE5DBF021E300D0A0E1040040E2FE :10006000D7F021E300D0A0E1040040E2D1F021E389 @@ -12,351 +12,308 @@ :1000B000D7F021E300D0A0E1040040E2D1F021E339 :1000C00000D0A0E1040040E2D2F021E300D0A0E1A2 :1000D000040040E2D3F021E300D0A0E1040040E2BC -:1000E000DFF021E300D0A0E1010000EBB80000EB5D +:1000E000DFF021E300D0A0E1010000EB810000EB94 :1000F000140000EA38109FE538209FE538309FE56E :10010000030052E10400913404008234FBFFFF3A03 :100110000000A0E324109FE524209FE5020051E1A8 :1001200004008134FCFFFF3A1EFF2FE140C01FE0B6 -:10013000DC1E004088160000000200400002004063 -:1001400000020040F406004010402DE908D04DE2C6 -:10015000FC309FE5003093E504308DE503308DE2FF -:100160000040A0E3EC109FE5EC209FE50100F3E5E3 -:10017000910000E0260A40E2160E40E2020050E143 -:100180000800009A014084E2FF4004E2040054E3C6 -:10019000F5FFFF1AC4009FE57010A0E3C0309FE593 -:1001A0000FE0A0E113FF2FE18422A0E1022082E30F -:1001B000FF2002E2AC309FE58420C3E55510E0E368 -:1001C0008C10C3E55520A0E38C20C3E50100A0E31B -:1001D0008000C3E58C10C3E58C20C3E5B828D3E1CB -:1001E000010B12E3FCFFFF0A78309FE50320A0E338 -:1001F0008020C3E55520E0E38C20C3E5AB2082E2FC -:100200008C20C3E50020A0E30020C3E5042082E2A7 -:100210000420C3E50220A0E30020C3E50120A0E301 -:10022000013C83E20020C3E53C309FE5002093E5DC -:10023000052082E3002083E530309FE50FE0A0E158 -:1002400013FF2FE128409FE50FE0A0E114FF2FE10D -:10025000FCFFFFEA64150000C0D40100A08002008A -:10026000301600007C0A000000C01FE000C002E061 -:1002700078020000C402000008402DE930309FE5FC -:100280000FE0A0E113FF2FE128309FE50FE0A0E190 -:1002900013FF2FE120309FE50FE0A0E113FF2FE1D6 -:1002A00018309FE50FE0A0E113FF2FE10840BDE803 -:1002B0001EFF2FE1740A0000440A0000800D0000B8 -:1002C0000003000008402DE924309FE50FE0A0E185 -:1002D00013FF2FE11C309FE50FE0A0E113FF2FE19A -:1002E00014309FE50FE0A0E113FF2FE10840BDE8C7 -:1002F0001EFF2FE1780A000068030000C809000013 -:1003000004E02DE50CD04DE20030E0E30430CDE513 -:100310000030A0E30530CDE538309FE50FE0A0E1E7 -:1003200013FF2FE130309FE50FE0A0E113FF2FE135 -:1003300028309FE50030D3E5010053E304008D022F -:100340001C309F050FE0A00113FF2F010CD08DE2A0 -:1003500004E09DE41EFF2FE148040000DC0B0000D8 -:10036000000200409C04000008402DE924009FE5A5 -:1003700024309FE50FE0A0E113FF2FE1010050E3DF -:1003800010009F0514309F050FE0A00113FF2F01FF -:100390000840BDE81EFF2FE104020040C40C00002D -:1003A0009C04000008402DE9FF1001E218309FE591 -:1003B0000FE0A0E113FF2FE110309FE50FE0A0E177 -:1003C00013FF2FE10840BDE81EFF2FE11C0C0000C9 -:1003D000880400000120A0E304309FE50020C3E56D -:1003E0001EFF2FE10002004004309FE50000D3E52E -:1003F0001EFF2FE10002004008402DE90C309FE570 -:100400000FE0A0E113FF2FE10840BDE81EFF2FE140 -:10041000700400000020A0E304309FE50120C3E544 -:100420001EFF2FE14402004014309FE50120E0E36D -:100430000320C3E50400C3E50220A0E3B424C3E124 -:100440001EFF2FE1440200401C309FE50020A0E386 -:100450000020C3E5482083E54320C3E5B424C3E17D -:100460000220C3E50120C3E51EFF2FE14402004046 -:100470000C309FE50000D3E5000050E20100A0131E -:100480001EFF2FE1440200400020A0E304309FE55E -:100490004320C3E51EFF2FE14402004038402DE910 -:1004A0000040A0E10030D0E5FF0053E31200001A45 -:1004B000D7FFFFEBEC349FE50120A0E30020C3E56C -:1004C0000010E0E30310C3E51010A0E30410C3E53F -:1004D0000010A0E30510C3E54000A0E30600C3E55B -:1004E0000700C3E50810C3E50920C3E50A20C3E5FA -:1004F0000820A0E3B424C3E11B0100EAA4249FE583 -:100500000020D2E5010052E32401001AC93043E281 -:10051000350053E303F19F97110100EAC80700007B -:100520006409000064090000580900006409000023 -:1005300064090000340900001C080000F0080000F5 -:10054000B8080000640900006409000064090000A4 -:1005500064090000640900006409000064090000E7 -:1005600064090000640900006409000064090000D7 -:1005700064090000640900006409000064090000C7 -:1005800064090000640900006409000064090000B7 -:1005900064090000640900006409000064090000A7 -:1005A0006409000064090000640900006409000097 -:1005B0006409000064090000640900006409000087 -:1005C00064090000CC0600004C060000F4050000A1 -:1005D000AC06000064090000640900006409000022 -:1005E0002C07000064090000640700007007000089 -:1005F000A40700000120D0E53F0052E30200009A6A -:100600002200A0E387FFFFEBD70000EA94539FE5A9 -:10061000040085E2481095E58C339FE50FE0A0E1EA -:1006200013FF2FE10030E0E30330C5E50120D4E5FE -:10063000483095E5033082E0483085E50130D4E567 -:10064000013083E2B434C5E1C70000EA0130D0E5EF -:100650003F0053E30200009A2200A0E371FFFFEB8A -:10066000C10000EA041090E538539FE5481085E585 -:10067000040085E20120D4E52C339FE50FE0A0E1E2 -:1006800013FF2FE10030E0E30330C5E50120D4E59E -:10069000483095E5033082E0483085E50130D4E507 -:1006A000013083E2B434C5E1AF0000EAF4329FE5E3 -:1006B0000020E0E30320C3E5042090E5482083E523 -:1006C0000120A0E3B424C3E1A70000EAD4C29FE55F -:1006D0000030E0E30330CCE548109CE5043090E5C1 -:1006E000000053E30020A0030500000A0020A0E35F -:1006F0000100D1E4002082E0FF2002E2013053E259 -:10070000FAFFFF1A07208CE598329FE50120A0E34D -:100710000420C3E50020A0E30520C3E50620C3E5CF -:100720000820A0E3B424C3E18F0000EA74329FE5FF -:100730000020E0E30320C3E570229FE5482083E525 -:100740000020A0E30420C3E50520C3E50620C3E59F -:100750000720A0E3072083E50820A0E3B424C3E139 -:10076000810000EA0000A0E32EFFFFEB7E0000EA1C -:1007700030329FE50020E0E30320C3E50020A0E342 -:100780000420C3E50110D3E50510C3E50620C3E549 -:100790000720C3E50820C3E50620A0E3B424C3E195 -:1007A000710000EAFC419FE50030A0E30030C4E5A1 -:1007B00017FFFFEB0030E0E30330C4E50130A0E3B6 -:1007C000B434C4E1680000EAD8319FE5480093E5FD -:1007D0003F10A0E3012084E2D4319FE50FE0A0E1C7 -:1007E00013FF2FE1000050E30200001A3100A0E3E4 -:1007F0000CFFFFEB5C0000EAA8319FE50020E0E37E -:100800000320C3E5482093E53F2082E2482083E5AA -:100810000120A0E3B424C3E1530000EA0130D0E595 -:100820003E0053E30200009A2200A0E3FDFEFFEB2E -:100830004D0000EA6C319FE50020E0E30320C3E5B2 -:100840000120A0E3B424C3E10110D0E5000051E38E -:100850000700001A5C319FE50FE0A0E113FF2FE1D4 -:10086000000050E34000001A3100A0E3EDFEFFEB72 -:100870003D0000EA2C319FE5480093E5022084E228 -:100880002C319FE50FE0A0E113FF2FE1000050E3C2 -:100890000200001A3100A0E3E2FEFFEB320000EAA2 -:1008A00000319FE50110D4E5482093E5022081E066 -:1008B000482083E52C0000EAE8309FE50020E0E3D3 -:1008C0000320C3E50020A0E30420C3E50520C3E521 -:1008D0004010A0E30610C3E50720C3E50820C3E5E8 -:1008E0000920C3E50720A0E3B424C3E11E0000EA09 -:1008F000B0309FE5480093E5041094E5B8309FE5DB -:100900000FE0A0E113FF2FE1000050E30200001A06 -:100910003100A0E3C3FEFFEB130000EA84309FE543 -:100920000020E0E30320C3E50120A0E3B424C3E1F9 -:100930000D0000EA84309FE50FE0A0E113FF2FE1F6 -:1009400060309FE50020E0E30320C3E50120A0E341 -:10095000B424C3E1040000EA3100A0E3B1FEFFEBE0 -:10096000010000EA2000A0E3AEFEFFEB34309FE57B -:100970004330D3E5010053E31000A003A9FEFF0BB1 -:1009800020309FE50120A0E34320C3E5030083E27C -:10099000B414D3E128309FE50FE0A0E113FF2FE16D -:1009A0003840BDE81EFF2FE144020040A40A0000C9 -:1009B000681500009C0D0000F00D0000B80D00004F -:1009C000380B0000A403000008402DE95C309FE5CF -:1009D0000FE0A0E113FF2FE1010050E31100000A36 -:1009E0004C309FE50030D3E5010053E30D00001AC1 -:1009F00040309FE50FE0A0E113FF2FE1310050E30D -:100A00000800009A0020A0E324309FE50020C3E501 -:100A100024309FE50FE0A0E113FF2FE11C309FE59C -:100A20000FE0A0E113FF2FE10840BDE81EFF2FE11A -:100A3000F803000090020040C80E0000240E0000E1 -:100A4000E80A000008402DE90120A0E318309FE5E6 -:100A50000020C3E514309FE50FE0A0E113FF2FE174 -:100A6000D8FFFFEB0840BDE81EFF2FE190020040D9 -:100A7000800E00001EFF2FE11EFF2FE110402DE928 -:100A800014309FE5000083E5041083E50C409FE5EA -:100A90000FE0A0E114FF2FE1FCFFFFEA9402004009 -:100AA000780A0000F8402DE90140A0E1005052E230 -:100AB0000900000A0060A0E124709FE50130D4E441 -:100AC0000130C6E40FE0A0E117FF2FE1015045E23D -:100AD0000558A0E12558B0E1F7FFFF1AF840BDE83E -:100AE0001EFF2FE1780A000008402DE93C309FE509 -:100AF0000FE0A0E113FF2FE1000050E30900000A1E -:100B00000101A0E3021AA0E34020A0E3E4FFFFEB11 -:100B10000220A0E318309FE5402083E50131A0E3E7 -:100B20000FE0A0E113FF2FE10840BDE81EFF2FE119 -:100B3000D40D000000C01FE008402DE90C309FE5F7 -:100B40000FE0A0E113FF2FE10840BDE81EFF2FE1F9 -:100B5000500000001C309FE51430D3E5010013E382 -:100B600010309F150030D3150030C0150100A013C0 -:100B70000000A0031EFF2FE100C000E038402DE977 -:100B80004C309FE51430D3E5200013E30000A003B0 -:100B90000D00000A38309FE50000C3E51430D3E5AE -:100BA000200013E30100A0130700001A24509FE562 -:100BB0001C409FE50FE0A0E115FF2FE11430D4E5C4 -:100BC000200013E3FAFFFF0A0100A0E33840BDE86C -:100BD0001EFF2FE100C000E0780A000034309FE5DE -:100BE0000020A0E30420C3E50820C3E51420C3E5EA -:100BF0007F10E0E30C10C3E54110A0E30010C3E553 -:100C00000420C3E50320A0E30C20C3E50720A0E3F4 -:100C10000820C3E51EFF2FE100C000E0F8452DE9E4 -:100C20000050A0E10140A0E1400051E384009F8515 -:100C30008310A08380309F850FE0A08113FF2F8158 -:100C40000400A0E1CCFFFFEB010050E364009F151E -:100C50008610A01360309F150FE0A01113FF2F1115 -:100C60000460A0E1000054E31000000A0040A0E38B -:100C700048709FE53C809FE53CA09FE50FE0A0E128 -:100C800017FF2FE10400D5E7BBFFFFEB010050E3A6 -:100C90000800A0118E10A0130FE0A0111AFF2F1151 -:100CA000014084E20438A0E1230856E1F2FFFF8A04 -:100CB000F845BDE81EFF2FE1381600007C0A000051 -:100CC000780A000070402DE90050A0E1A0309FE5B7 -:100CD0000030D3E5000053E30A00001A94009FE5BA -:100CE0009BFFFFEB010050E30000A0131E00001A61 -:100CF0007C309FE50120A0E30020C3E50000A0E3D5 -:100D00004500C3E5180000EA64009FE54540D0E5D2 -:100D1000040080E0050080E28DFFFFEB010050E35E -:100D20000000A0131000001A014084E2FF2004E23A -:100D30003C309FE54520C3E50430D3E5020053E194 -:100D40000000A0130800001A24609FE50500A0E140 -:100D5000051086E220309FE50FE0A0E113FF2FE1B0 -:100D60000030A0E30030C6E50100A0E37040BDE81C -:100D70001EFF2FE19C020040A0020040A40A0000D8 -:100D800008402DE90C309FE50FE0A0E113FF2FE1B3 -:100D90000840BDE81EFF2FE11C12000008402DE9AD -:100DA0000C309FE50FE0A0E113FF2FE10840BDE804 -:100DB0001EFF2FE13412000008402DE90C309FE5A2 -:100DC0000FE0A0E113FF2FE10840BDE81EFF2FE177 -:100DD000A012000008402DE90C309FE50FE0A0E1D3 -:100DE00013FF2FE10840BDE81EFF2FE1D4130000E0 -:100DF00008402DE920309FE50FE0A0E113FF2FE12F -:100E0000000050E30000A00310309F150FE0A01178 -:100E100013FF2F110840BDE81EFF2FE11C14000036 -:100E20009414000014309FE50020A0E3042083E523 -:100E30000C2083E5082083E5102083E51EFF2FE1C9 -:100E4000004000E01C309FE5082093E518309FE546 -:100E5000001093E5011082E0040093E5011060E0CA -:100E6000060083E81EFF2FE1004000E0E40200409E -:100E700004309FE5000083E51EFF2FE1E4020040FF -:100E800008402DE930309FE50000A0E3140083E521 -:100E9000280083E524209FE50C2083E50120A0E3C2 -:100EA000042083E5082093E514309FE5042083E5C2 -:100EB000EEFFFFEB0840BDE81EFF2FE1004000E021 -:100EC0005FEA0000E402004008402DE9DCFFFFEB90 -:100ED00008309FE5000093E50840BDE81EFF2FE1C4 -:100EE000E4020040F0412DE90060A0E10040A0E3F1 -:100EF0000450A0E158809FE558709FE50FE0A0E105 -:100F000018FF2FE1043097E7060053E10900008A3B -:100F1000041087E0041091E5013083E0030056E1FE -:100F20000400002A852085E028309FE5023183E017 -:100F30000800D3E5040000EA015085E20C4084E299 -:100F4000C00054E3ECFFFF1AFF00A0E3F041BDE84E -:100F50001EFF2FE1780A00007015000030402DE9D7 -:100F600024D04DE20040A0E1000090E5DCFFFFEB63 -:100F7000FF0050E30000A0033D00000A3230A0E370 -:100F80000C308DE510008DE514008DE50130A0E3F7 -:100F900000308DE5E4309FE50FE0A0E113FF2FE185 -:100FA0000C008DE20D10A0E13A31E0E30FE0A0E18A -:100FB00013FF2FE100309DE5000053E30000A01374 -:100FC0002B00001A3330A0E30C308DE50450A0E173 -:100FD000043095E410308DE514508DE5023CA0E31B -:100FE00018308DE598309FE51C308DE50130A0E389 -:100FF00000308DE584309FE50FE0A0E113FF2FE185 -:101000000C008DE20D10A0E13A31E0E30FE0A0E129 -:1010100013FF2FE100309DE5000053E30000A01313 -:101020001300001A3830A0E30C308DE5003094E551 -:1010300010308DE514508DE5023CA0E318308DE5AD -:101040000130A0E300308DE530309FE50FE0A0E1F6 -:1010500013FF2FE10C008DE20D10A0E13A31E0E327 -:101060000FE0A0E113FF2FE100009DE5010070E219 -:101070000000A03324D08DE23040BDE81EFF2FE1F8 -:10108000780A000060EA000008402DE9813BB0E1E9 -:101090000000A0130900001A003090E5010053E1A0 -:1010A0000100A0030500000A041080E4022CA0E364 -:1010B00010309FE50FE0A0E113FF2FE10100A0E356 -:1010C0000840BDE81EFF2FE1A40A000038402DE9CA -:1010D0000040A0E10150A0E14C309FE5030050E149 -:1010E0000600000A020A51E30600000A9AFFFFEB1D -:1010F000000050E30040A0030800000A020000EADC -:1011000028409FE5000000EA1C409FE50400A0E1A4 -:101110000510A0E1DBFFFFEB000050E30040A0035F -:101120000400A0E13840BDE81EFF2FE1F0040040BC -:10113000EC020040F0472DE90050A0E10140A0E1A1 -:101140000270A0E10360A0E1A194A0E18994A0E174 -:10115000003090E5010073E30400001A0910A0E1DB -:10116000C8FFFFEB000050E30000A0032600000AC8 -:10117000003095E5090053E10500000A0500A0E1F3 -:101180000910A0E1D0FFFFEB005050E20000A003E7 -:101190001D00000A003095E5044063E0044085E04E -:1011A000044084E268809FE568A09FE5029C89E294 -:1011B0000FE0A0E118FF2FE1043085E2043063E086 -:1011C0000A0053E10500009A0500A0E10910A0E122 -:1011D000BDFFFFEB005050E20800000A044085E22A -:1011E0000130D7E40030C4E5016046E20668A0E1C2 -:1011F0002668B0E10300000A014084E2EBFFFFEA49 -:101200000000A0E3000000EA0100A0E3F047BDE811 -:101210001EFF2FE1780A0000FF0100000C309FE55F -:101220000020E0E3002083E5042283E51EFF2FE198 -:10123000EC02004070402DE90040A0E10150A0E127 -:101240000260A0E126FFFFEBFF0050E30000A003D7 -:101250000E00000A010044E2050080E020FFFFEBE1 -:10126000FF0050E30000A0030800000AA434A0E13E -:10127000100053E30538A0E118009F0518009F15E2 -:101280000410A0E10620A0E12338A0E1A8FFFFEBB5 -:101290007040BDE81EFF2FE1F0040040EC0200406A -:1012A00070402DE920D04DE20050A0E10160A0E1A6 -:1012B0000BFFFFEB0040A0E1010045E2060080E0EB -:1012C00007FFFFEB0050A0E1FF0050E3FF005413C5 -:1012D0000000A0033900000A050054E10000A083CB -:1012E0003600008A000054E30000A0033300000A27 -:1012F000100055E30000A0833000008A3230A0E3E4 -:1013000038008DE80130A0E314308DE5B8309FE55A -:101310000FE0A0E113FF2FE10D00A0E114108DE21A -:101320003A31E0E30FE0A0E113FF2FE114309DE537 -:10133000000053E30000A0132000001A3430A0E3A3 -:1013400038008DE884309FE50C308DE50130A0E356 -:1013500014308DE570309FE50FE0A0E113FF2FE121 -:101360000D00A0E114108DE23A31E0E30FE0A0E1BE -:1013700013FF2FE114309DE5000053E30000A0139C -:101380000E00001A3530A0E338008DE80130A0E3EC -:1013900014308DE530309FE50FE0A0E113FF2FE121 -:1013A0000D00A0E114108DE23A31E0E30FE0A0E17E -:1013B00013FF2FE114009DE5010070E20000A0334F -:1013C00020D08DE27040BDE81EFF2FE1780A0000BA -:1013D00060EA0000023AA0E3050093E8000082E022 -:1013E000082093E5020080E00C2093E5020080E0F5 -:1013F000102093E5020080E0142093E5020080E0D5 -:10140000182093E5020080E01C3093E5030080E0A3 -:10141000010070E20000A0331EFF2FE110402DE913 -:1014200008D04DE260209FE5823F82E2120093E9FE -:10143000044081E0082292E5024084E00C2093E51C -:10144000024084E0102093E5024084E0182093E5F8 -:10145000024084E01C3093E5034084E0004064E2F5 -:1014600004408DE5DAFFFFEB000054E10100A0032A -:1014700018009F150410A01301208D106CFFFF1B96 -:1014800008D08DE21040BDE81EFF2FE1EC020040C5 -:101490001420000008402DE948309FE5043293E510 -:1014A000010073E30400000A3C009FE5AAFEFFEB85 -:1014B000000050E30000A0030800000A24309FE56C -:1014C000003093E5010073E30100A0030300000A6C -:1014D00010009FE5A0FEFFEB000050E20100A0130A -:1014E0000840BDE81EFF2FE1EC020040F004004080 -:1014F00004E04EE21F402DE910009FE53810A0E304 -:101500000C309FE50FE0A0E113FF2FE11F80FDE805 -:101510005C1600007C0A000004E04EE20F502DE94A -:1015200010009FE54610A0E30C309FE50FE0A0E11E -:1015300013FF2FE10F90FDE85C1600007C0A00000D -:101540000F502DE910009FE55410A0E30C309FE5EB -:101550000FE0A0E113FF2FE10F90FDE85C16000003 -:101560007C0A0000010204084F70656E424C540072 -:1015700000200000002000000100000000400000EA -:1015800000200000020000000060000000200000B9 -:1015900003000000008000000020000004000000A4 -:1015A00000A00000002000000500000000C00000B6 -:1015B000002000000600000000E000000020000005 -:1015C000070000000000010000000100080000000A -:1015D00000000200000001000900000000000300FC -:1015E000002000000A00000000200300002000008E -:1015F0000B00000000400300002000000C00000071 -:1016000000600300002000000D00000000800300C7 -:10161000002000000E00000000A0030000200000D9 -:101620000F00000000C003000020000010000000B8 -:101630006D61696E2E6300002E2E2F2E2E2F2E2E02 -:101640002F536F757263652F41524D375F4C504376 -:10165000323030302F756172742E63002E2E2F2E93 -:101660002E2F2E2E2F536F757263652F41524D37DB -:101670005F4C5043323030302F4743432F76656301 -:08168000746F72732E63000009 +:10013000DC1E0040D8130000000200400002004016 +:1001400000020040F406004010402DE9D8309FE541 +:100150000040A0E3D4109FE5D4209FE50100F3E523 +:10016000910000E0260A40E2160E40E2020050E153 +:100170000600009A014084E2FF4004E2040054E3D8 +:10018000F5FFFF1AAC009FE57010A0E3DB0100EB68 +:100190008422A0E1022082E3FF2002E298309FE562 +:1001A0008420C3E55510E0E38C10C3E55520A0E39F +:1001B0008C20C3E50100A0E38000C3E58C10C3E5FB +:1001C0008C20C3E5B828D3E1010B12E3FCFFFF0A42 +:1001D00064309FE50320A0E38020C3E55520E0E3E1 +:1001E0008C20C3E5AB2082E28C20C3E50020A0E395 +:1001F0000020C3E5042082E20420C3E50220A0E33E +:100200000020C3E50120A0E3013C83E20020C3E518 +:1002100028309FE5002093E5052082E3002083E558 +:10022000070000EB0D0000EBFDFFFFEAB31200003A +:10023000C0D40100A08002008013000000C01FE0B5 +:1002400000C002E008402DE9AA0100EBA00100EB8C +:10025000500200EB070000EB0840BDE81EFF2FE155 +:1002600008402DE9A40100EB130000EB850100EB31 +:100270000840BDE81EFF2FE104E02DE50CD04DE263 +:100280000030E0E30430CDE50030A0E30530CDE5FB +:10029000320000EBE20100EB18309FE50030D3E5BF +:1002A000010053E304008D024100000B0CD08DE2ED +:1002B00004E09DE41EFF2FE10002004008402DE90C +:1002C00014009FE5070200EB010050E308009F05C2 +:1002D0003700000B0840BDE81EFF2FE1040200407C +:1002E00008402DE9FF1001E2DD0100EB2B0000EBDF +:1002F0000840BDE81EFF2FE10120A0E304309FE588 +:100300000020C3E51EFF2FE10002004004309FE5FE +:100310000000D3E51EFF2FE10002004008402DE958 +:10032000180000EB0840BDE81EFF2FE10020A0E30D +:1003300004309FE50120C3E51EFF2FE14402004089 +:1003400014309FE50120E0E30320C3E50400C3E58A +:100350000220A0E3B424C3E11EFF2FE144020040C9 +:100360001C309FE50020A0E30020C3E5482083E582 +:100370004320C3E5B424C3E10220C3E50120C3E563 +:100380001EFF2FE1440200400C309FE50000D3E542 +:10039000000050E20100A0131EFF2FE144020040C4 +:1003A0000020A0E304309FE54320C3E51EFF2FE1BA +:1003B0004402004038402DE90040A0E10030D0E583 +:1003C000FF0053E31200001AD7FFFFEBAC349FE5A8 +:1003D0000120A0E30020C3E50010E0E30310C3E523 +:1003E0001010A0E30410C3E50010A0E30510C3E55E +:1003F0004000A0E30600C3E50700C3E50810C3E51D +:100400000920C3E50A20C3E50820A0E3B424C3E122 +:100410000D0100EA64249FE50020D2E5010052E3CB +:100420001401001AC93043E2350053E303F19F97EA +:10043000030100EAD0060000440800004408000060 +:100440003808000044080000440800001C080000B0 +:100450001C070000E0070000A80700004408000097 +:10046000440800004408000044080000440800005C +:10047000440800004408000044080000440800004C +:10048000440800004408000044080000440800003C +:10049000440800004408000044080000440800002C +:1004A000440800004408000044080000440800001C +:1004B000440800004408000044080000440800000C +:1004C00044080000440800004408000044080000FC +:1004D000440800004408000044080000D40500005F +:1004E0005C0500000C050000B40500004408000095 +:1004F00044080000440800003406000044080000DE +:100500006C06000078060000AC0600000120D0E573 +:100510003F0052E30200009A2200A0E387FFFFEBB6 +:10052000C90000EA54539FE5040085E2481095E5B0 +:10053000F90000EB0030E0E30330C5E50120D4E52D +:10054000483095E5033082E0483085E50130D4E558 +:10055000013083E2B434C5E1BB0000EA0130D0E5EC +:100560003F0053E30200009A2200A0E373FFFFEB79 +:10057000B50000EA041090E500539FE5481085E5BA +:10058000040085E20120D4E5E30000EB0030E0E365 +:100590000330C5E50120D4E5483095E5033082E01D +:1005A000483085E50130D4E5013083E2B434C5E15B +:1005B000A50000EAC4329FE50020E0E30320C3E584 +:1005C000042090E5482083E50120A0E3B424C3E1A2 +:1005D0009D0000EAA4C29FE50030E0E30330CCE5D3 +:1005E00048109CE5043090E5000053E30020A00390 +:1005F0000500000A0020A0E30100D1E4002082E011 +:10060000FF2002E2013053E2FAFFFF1A07208CE5D7 +:1006100068329FE50120A0E30420C3E50020A0E3A9 +:100620000520C3E50620C3E50820A0E3B424C3E108 +:10063000850000EA44329FE50020E0E30320C3E5A3 +:100640003C229FE5482083E50020A0E30420C3E589 +:100650000520C3E50620C3E50720A0E3072083E5C6 +:100660000820A0E3B424C3E1770000EA0000A0E37F +:1006700032FFFFEB740000EA00329FE50020E0E368 +:100680000320C3E50020A0E30420C3E50110D3E567 +:100690000510C3E50620C3E50720C3E50820C3E530 +:1006A0000620A0E3B424C3E1670000EACC419FE543 +:1006B0000030A0E30030C4E51BFFFFEB0030E0E3B7 +:1006C0000330C4E50130A0E3B434C4E15E0000EAC5 +:1006D000A8319FE5480093E53F10A0E3012084E2A4 +:1006E000300100EB000050E30200001A3100A0E3EB +:1006F00012FFFFEB540000EA80319FE50020E0E3A9 +:100700000320C3E5482093E53F2082E2482083E5AB +:100710000120A0E3B424C3E14B0000EA0130D0E59E +:100720003E0053E30200009A2200A0E303FFFFEB28 +:10073000450000EA44319FE50020E0E30320C3E5E3 +:100740000120A0E3B424C3E10110D0E5000051E38F +:100750000500001A1F0100EB000050E33A00001AE8 +:100760003100A0E3F5FEFFEB370000EA0C319FE516 +:10077000480093E5022084E20A0100EB000050E308 +:100780000200001A3100A0E3ECFEFFEB2E0000EAAD +:10079000E8309FE50110D4E5482093E5022081E090 +:1007A000482083E5280000EAD0309FE50020E0E300 +:1007B0000320C3E50020A0E30420C3E50520C3E532 +:1007C0004010A0E30610C3E50720C3E50820C3E5F9 +:1007D0000920C3E50720A0E3B424C3E11A0000EA1E +:1007E00098309FE5480093E5041094E5F10000EB94 +:1007F000000050E30200001A3100A0E3CFFEFFEB3F +:10080000110000EA74309FE50020E0E30320C3E517 +:100810000120A0E3B424C3E10B0000EA5D0000EB7B +:1008200058309FE50020E0E30320C3E50120A0E36A +:10083000B424C3E1040000EA3100A0E3BFFEFFEBF3 +:10084000010000EA2000A0E3BCFEFFEB2C309FE596 +:100850004330D3E5010053E31000A003B7FEFF0BC4 +:1008600018309FE50120A0E34320C3E5030083E2A5 +:10087000B414D3E199FEFFEB3840BDE81EFF2FE131 +:1008800044020040B812000008402DE9A2FEFFEB30 +:10089000010050E30B00000A30309FE50030D3E543 +:1008A000010053E30700001AFA0000EB310050E3A7 +:1008B0000400009A0020A0E310309FE50020C3E56B +:1008C000CB0000EB220000EB0840BDE81EFF2FE14B +:1008D0009002004008402DE90120A0E310309FE580 +:1008E0000020C3E5D90000EBE6FFFFEB0840BDE8C0 +:1008F0001EFF2FE1900200401EFF2FE11EFF2FE19F +:1009000008402DE90C309FE5000083E5041083E5E5 +:10091000F9FFFFEBFDFFFFEA9402004070402DE974 +:100920000140A0E1005052E20700000A0060A0E18F +:100930000130D4E40130C6E4EFFFFFEB015045E2A3 +:100940000558A0E12558B0E1F8FFFF1A7040BDE856 +:100950001EFF2FE108402DE99A0000EB000050E354 +:100960000900000A0101A0E3021AA0E34020A0E36D +:10097000E9FFFFEB0220A0E314309FE5402083E570 +:100980000131A0E30FE0A0E113FF2FE10840BDE833 +:100990001EFF2FE100C01FE008402DE9ABFDFFEB7B +:1009A0000840BDE81EFF2FE11C309FE51430D3E561 +:1009B000010013E310309F150030D3150030C0152F +:1009C0000100A0130000A0031EFF2FE100C000E003 +:1009D00010402DE944309FE51430D3E5200013E3A7 +:1009E0000000A0030B00000A30309FE50000C3E5C3 +:1009F0001430D3E5200013E30100A0130500001A12 +:100A000018409FE5BCFFFFEB1430D4E5200013E352 +:100A1000FBFFFF0A0100A0E31040BDE81EFF2FE12D +:100A200000C000E034309FE50020A0E30420C3E5CF +:100A30000820C3E51420C3E57F10E0E30C10C3E5F4 +:100A40004110A0E30010C3E50420C3E50320A0E3A8 +:100A50000C20C3E50720A0E30820C3E51EFF2FE11B +:100A600000C000E0F0412DE90050A0E10140A0E10C +:100A7000400051E368009F858310A0839FFFFF8B98 +:100A80000400A0E1D1FFFFEB010050E350009F15EF +:100A90008610A01399FFFF1B0460A0E1000054E33F +:100AA0000D00000A0040A0E334709FE58E80A0E3B3 +:100AB00091FFFFEB0400D5E7C4FFFFEB010050E31B +:100AC0000700A0110810A0118CFFFF1B014084E259 +:100AD0000438A0E1230856E1F4FFFF8AF041BDE8A5 +:100AE0001EFF2FE18813000070402DE90050A0E1A7 +:100AF00098309FE50030D3E5000053E30A00001A68 +:100B00008C009FE5A7FFFFEB010050E30000A0135E +:100B10001C00001A74309FE50120A0E30020C3E50B +:100B20000000A0E34500C3E5160000EA5C009FE575 +:100B30004540D0E5040080E0050080E299FFFFEB2E +:100B4000010050E30000A0130E00001A014084E2EF +:100B5000FF2004E234309FE54520C3E50430D3E5AF +:100B6000020053E10000A0130600001A1C609FE57C +:100B70000500A0E1051086E267FFFFEB0030A0E36F +:100B80000030C6E50100A0E37040BDE81EFF2FE184 +:100B90009C020040A002004008402DE9020100EB49 +:100BA0000840BDE81EFF2FE108402DE9040100EBDD +:100BB0000840BDE81EFF2FE108402DE91B0100EBB6 +:100BC0000840BDE81EFF2FE108402DE95D0100EB64 +:100BD0000840BDE81EFF2FE108402DE96B0100EB46 +:100BE000000050E30000A0038601001B0840BDE8A0 +:100BF0001EFF2FE114309FE50020A0E3042083E5D1 +:100C00000C2083E5082083E5102083E51EFF2FE1FB +:100C1000004000E01C309FE5082093E518309FE578 +:100C2000001093E5011082E0040093E5011060E0FC +:100C3000060083E81EFF2FE1004000E0E4020040D0 +:100C400004309FE5000083E51EFF2FE1E402004031 +:100C500008402DE930309FE50000A0E3140083E553 +:100C6000280083E524209FE50C2083E50120A0E3F4 +:100C7000042083E5082093E514309FE5042083E5F4 +:100C8000EEFFFFEB0840BDE81EFF2FE1004000E053 +:100C90005FEA0000E402004008402DE9DCFFFFEBC2 +:100CA00008309FE5000093E50840BDE81EFF2FE1F6 +:100CB000E4020040F8402DE90060A0E10040A0E31C +:100CC0000450A0E150709FE50BFFFFEB043097E765 +:100CD000060053E10900008A041087E0041091E542 +:100CE000013083E0030056E10400002A852085E0FE +:100CF00024309FE5023183E00800D3E5040000EAD8 +:100D0000015085E20C4084E2C00054E3EDFFFF1A7D +:100D1000FF00A0E3F840BDE81EFF2FE1C012000075 +:100D200030402DE924D04DE20040A0E1000090E5E4 +:100D3000DFFFFFEBFF0050E30000A0033700000AD5 +:100D40003230A0E30C308DE510008DE514008DE508 +:100D50000130A0E300308DE5E7FEFFEB0C008DE2F3 +:100D60000D10A0E13A31E0E30FE0A0E113FF2FE125 +:100D700000309DE5000053E30000A0132700001A97 +:100D80003330A0E30C308DE50450A0E1043095E44D +:100D900010308DE514508DE5023CA0E318308DE550 +:100DA00084309FE51C308DE50130A0E300308DE5F7 +:100DB000D1FEFFEB0C008DE20D10A0E13A31E0E333 +:100DC0000FE0A0E113FF2FE100309DE5000053E3A9 +:100DD0000000A0131100001A3830A0E30C308DE59C +:100DE000003094E510308DE514508DE5023CA0E311 +:100DF00018308DE50130A0E300308DE5BEFEFFEB3D +:100E00000C008DE20D10A0E13A31E0E30FE0A0E12B +:100E100013FF2FE100009DE5010070E20000A03308 +:100E200024D08DE23040BDE81EFF2FE160EA0000D3 +:100E300008402DE9813BB0E10000A0130700001A33 +:100E4000003090E5010053E10100A0030300000A17 +:100E5000041080E4022CA0E3AFFEFFEB0100A0E34E +:100E60000840BDE81EFF2FE138402DE90040A0E119 +:100E70000150A0E14C309FE5030050E10600000A5C +:100E8000020A51E30600000AA4FFFFEB000050E352 +:100E90000040A0030800000A020000EA28409FE585 +:100EA000000000EA1C409FE50400A0E10510A0E15D +:100EB000DEFFFFEB000050E30040A0030400A0E1D0 +:100EC0003840BDE81EFF2FE1F0040040EC02004076 +:100ED000F8452DE90050A0E10140A0E10270A0E139 +:100EE0000360A0E1A1A4A0E18AA4A0E1003090E504 +:100EF000010073E30400001A0A10A0E1CBFFFFEB2E +:100F0000000050E30000A0032400000A003095E533 +:100F10000A0053E10500000A0500A0E10A10A0E163 +:100F2000D0FFFFEB005050E20000A0031B00000ABE +:100F3000003095E5044063E0044085E0044084E22D +:100F400060809FE502AC8AE26BFEFFEB043085E235 +:100F5000043063E0080053E10500009A0500A0E1B9 +:100F60000A10A0E1BFFFFFEB005050E20800000AAA +:100F7000044085E20130D7E40030C4E5016046E278 +:100F80000668A0E12668B0E10300000A014084E29F +:100F9000ECFFFFEA0000A0E3000000EA0100A0E38C +:100FA000F845BDE81EFF2FE1FF0100000C309FE572 +:100FB0000020E0E3002083E5042283E51EFF2FE10B +:100FC000EC02004070402DE90040A0E10150A0E19A +:100FD0000260A0E136FFFFEBFF0050E30000A0033A +:100FE0000E00000A010044E2050080E030FFFFEB44 +:100FF000FF0050E30000A0030800000AA434A0E1B1 +:10100000100053E30538A0E118009F0518009F1554 +:101010000410A0E10620A0E12338A0E1ABFFFFEB24 +:101020007040BDE81EFF2FE1F0040040EC020040DC +:1010300070402DE920D04DE20050A0E10160A0E118 +:101040001BFFFFEB0040A0E1010045E2060080E04D +:1010500017FFFFEB0050A0E1FF0050E3FF00541327 +:101060000000A0033300000A050054E10000A08343 +:101070003000008A000054E30000A0032D00000AA5 +:10108000100055E30000A0832A00008A3230A0E35C +:1010900038008DE80130A0E314308DE516FEFFEB3B +:1010A0000D00A0E114108DE23A31E0E30FE0A0E181 +:1010B00013FF2FE114309DE5000053E30000A0135F +:1010C0001C00001A3430A0E338008DE870309FE532 +:1010D0000C308DE50130A0E314308DE506FEFFEB0A +:1010E0000D00A0E114108DE23A31E0E30FE0A0E141 +:1010F00013FF2FE114309DE5000053E30000A0131F +:101100000C00001A3530A0E338008DE80130A0E370 +:1011100014308DE5F8FDFFEB0D00A0E114108DE219 +:101120003A31E0E30FE0A0E113FF2FE114009DE569 +:10113000010070E20000A03320D08DE27040BDE8D5 +:101140001EFF2FE160EA0000023AA0E3050093E8E9 +:10115000000082E0082093E5020080E00C2093E587 +:10116000020080E0102093E5020080E0142093E567 +:10117000020080E0182093E5020080E01C3093E537 +:10118000030080E0010070E20000A0331EFF2FE1A9 +:1011900010402DE908D04DE260209FE5823F82E2B9 +:1011A000120093E9044081E0082292E5024084E0C5 +:1011B0000C2093E5024084E0102093E5024084E097 +:1011C000182093E5024084E01C3093E5034084E05E +:1011D000004064E204408DE5DAFFFFEB000054E1DB +:1011E0000100A00318009F150410A01301208D100A +:1011F00073FFFF1B08D08DE21040BDE81EFF2FE1FA +:10120000EC0200401420000008402DE948309FE522 +:10121000043293E5010073E30400000A3C009FE5FB +:10122000BEFEFFEB000050E30000A0030800000A30 +:1012300024309FE5003093E5010073E30100A00333 +:101240000300000A10009FE5B4FEFFEB000050E22F +:101250000100A0130840BDE81EFF2FE1EC02004092 +:10126000F004004004E04EE21F402DE908009FE535 +:101270003810A0E3A1FDFFEB1F80FDE8AC130000D8 +:1012800004E04EE20F502DE908009FE54610A0E370 +:101290009AFDFFEB0F90FDE8AC1300000F502DE915 +:1012A00008009FE55410A0E394FDFFEB0F90FDE8CC +:1012B000AC130000010204084F70656E424C5400EC +:1012C000002000000020000001000000004000009D +:1012D000002000000200000000600000002000006C +:1012E0000300000000800000002000000400000057 +:1012F00000A00000002000000500000000C0000069 +:10130000002000000600000000E0000000200000B7 +:1013100007000000000001000000010008000000BC +:1013200000000200000001000900000000000300AE +:10133000002000000A000000002003000020000040 +:101340000B00000000400300002000000C00000023 +:1013500000600300002000000D000000008003007A +:10136000002000000E00000000A00300002000008C +:101370000F00000000C0030000200000100000006B +:101380006D61696E2E6300002E2E2F2E2E2F2E2EB5 +:101390002F536F757263652F41524D375F4C504329 +:1013A000323030302F756172742E63002E2E2F2E46 +:1013B0002E2F2E2E2F536F757263652F41524D378E +:1013C0005F4C5043323030302F4743432F766563B4 +:0813D000746F72732E630000BC :00000001FF diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/bin/openbtl_olimex_lpc_l2294_20mhz.map b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/bin/openbtl_olimex_lpc_l2294_20mhz.map index d2e23625..cd698c0e 100644 --- a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/bin/openbtl_olimex_lpc_l2294_20mhz.map +++ b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/bin/openbtl_olimex_lpc_l2294_20mhz.map @@ -7,38 +7,38 @@ start address 0x00000000 Program Header: LOAD off 0x00008000 vaddr 0x00000000 paddr 0x00000000 align 2**15 - filesz 0x00001688 memsz 0x00001688 flags r-x - LOAD off 0x00010200 vaddr 0x40000200 paddr 0x00001688 align 2**15 + filesz 0x000013d8 memsz 0x000013d8 flags r-x + LOAD off 0x00010200 vaddr 0x40000200 paddr 0x000013d8 align 2**15 filesz 0x00000000 memsz 0x000004f4 flags rw- private flags = 5000000: [Version5 EABI] Sections: Idx Name Size VMA LMA File off Algn - 0 .text 00001688 00000000 00000000 00008000 2**2 + 0 .text 000013d8 00000000 00000000 00008000 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .bss 000004f4 40000200 00001688 00010200 2**2 + 1 .bss 000004f4 40000200 000013d8 00010200 2**2 ALLOC - 2 .ARM.attributes 00000030 00000000 00000000 00009688 2**0 + 2 .ARM.attributes 00000030 00000000 00000000 000093d8 2**0 CONTENTS, READONLY - 3 .comment 0000002a 00000000 00000000 000096b8 2**0 + 3 .comment 0000002a 00000000 00000000 00009408 2**0 CONTENTS, READONLY - 4 .debug_abbrev 00000a61 00000000 00000000 000096e2 2**0 + 4 .debug_abbrev 00000aa1 00000000 00000000 00009432 2**0 CONTENTS, READONLY, DEBUGGING - 5 .debug_info 0000173c 00000000 00000000 0000a143 2**0 + 5 .debug_info 000017a7 00000000 00000000 00009ed3 2**0 CONTENTS, READONLY, DEBUGGING - 6 .debug_line 00000878 00000000 00000000 0000b87f 2**0 + 6 .debug_line 0000088b 00000000 00000000 0000b67a 2**0 CONTENTS, READONLY, DEBUGGING - 7 .debug_pubtypes 00000312 00000000 00000000 0000c0f7 2**0 + 7 .debug_pubtypes 00000324 00000000 00000000 0000bf05 2**0 CONTENTS, READONLY, DEBUGGING - 8 .debug_str 000008fa 00000000 00000000 0000c409 2**0 + 8 .debug_str 00000905 00000000 00000000 0000c229 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_loc 00000bf9 00000000 00000000 0000cd03 2**0 + 9 .debug_loc 00000bed 00000000 00000000 0000cb2e 2**0 CONTENTS, READONLY, DEBUGGING - 10 .debug_pubnames 000003af 00000000 00000000 0000d8fc 2**0 + 10 .debug_pubnames 000003af 00000000 00000000 0000d71b 2**0 CONTENTS, READONLY, DEBUGGING - 11 .debug_aranges 000001a0 00000000 00000000 0000dcab 2**0 + 11 .debug_aranges 000001a0 00000000 00000000 0000daca 2**0 CONTENTS, READONLY, DEBUGGING - 12 .debug_frame 0000063c 00000000 00000000 0000de4c 2**2 + 12 .debug_frame 0000062c 00000000 00000000 0000dc6c 2**2 CONTENTS, READONLY, DEBUGGING SYMBOL TABLE: 00000000 l d .text 00000000 .text @@ -80,15 +80,16 @@ e01fc040 l *ABS* 00000000 MEMMAP 000000a0 l .text 00000000 Reset_Handler_SWI 00000000 l df *ABS* 00000000 hooks.c 00000000 l df *ABS* 00000000 main.c -00001564 l O .text 00000004 C.0.2157 +000012b4 l O .text 00000004 pll_dividers.1366 +00000000 l df *ABS* 00000000 extflash.c 00000000 l df *ABS* 00000000 boot.c 00000000 l df *ABS* 00000000 com.c 40000200 l O .bss 00000001 comEntryStateConnect 40000204 l O .bss 00000040 xcpCtoReqPacket.1371 00000000 l df *ABS* 00000000 xcp.c -00000414 l F .text 00000014 XcpProtectResources -00000428 l F .text 00000020 XcpSetCtoError -00001568 l O .text 00000008 xcpStationId +0000032c l F .text 00000014 XcpProtectResources +00000340 l F .text 00000020 XcpSetCtoError +000012b8 l O .text 00000008 xcpStationId 40000244 l O .bss 0000004c xcpInfo 00000000 l df *ABS* 00000000 backdoor.c 40000290 l O .bss 00000001 backdoorOpen @@ -99,8 +100,8 @@ e01fc040 l *ABS* 00000000 MEMMAP 00000000 l df *ABS* 00000000 cpu.c 00000000 l df *ABS* 00000000 can.c 00000000 l df *ABS* 00000000 uart.c -00000b54 l F .text 00000028 UartReceiveByte -00000b7c l F .text 00000060 UartTransmitByte +000009a8 l F .text 00000028 UartReceiveByte +000009d0 l F .text 00000054 UartTransmitByte 4000029c l O .bss 00000001 xcpCtoRxInProgress.1383 400002a0 l O .bss 00000041 xcpCtoReqPacket.1381 400002e1 l O .bss 00000001 xcpCtoRxLength.1382 @@ -109,68 +110,68 @@ e01fc040 l *ABS* 00000000 MEMMAP 400002e4 l O .bss 00000004 millisecond_counter 400002e8 l O .bss 00000004 free_running_counter_last 00000000 l df *ABS* 00000000 flash.c -00000ee4 l F .text 00000078 FlashGetSector -00000f5c l F .text 0000012c FlashWriteBlock -00001088 l F .text 00000044 FlashInitBlock -000010cc l F .text 00000068 FlashSwitchBlock -00001134 l F .text 000000e8 FlashAddToBlock -00001570 l O .text 000000c0 flashLayout +00000cb4 l F .text 0000006c FlashGetSector +00000d20 l F .text 00000110 FlashWriteBlock +00000e30 l F .text 00000038 FlashInitBlock +00000e68 l F .text 00000068 FlashSwitchBlock +00000ed0 l F .text 000000dc FlashAddToBlock +000012c0 l O .text 000000c0 flashLayout 400002ec l O .bss 00000204 blockInfo 400004f0 l O .bss 00000204 bootBlockInfo 00000000 l df *ABS* 00000000 vectors.c -00000300 g F .text 00000068 ComInit -00001234 g F .text 0000006c FlashWrite -00000a7c g F .text 00000028 AssertFailure -00001518 g F .text 00000028 IRQ_ISR -00000e44 g F .text 0000002c TimerUpdate -00000488 g F .text 00000014 XcpPacketTransmitted -00000368 g F .text 0000003c ComTask -000003d4 g F .text 00000014 ComSetConnectEntryState -00000278 g F .text 0000004c BootInit -00000a44 g F .text 00000030 BackDoorInit -00000a78 g F .text 00000004 CopService -00001688 g .text 00000000 _etext -00000e24 g F .text 00000020 TimerReset -000002c4 g F .text 0000003c BootTask -0000141c g F .text 00000078 FlashWriteChecksum +00000278 g F .text 00000044 ComInit +00000fc4 g F .text 0000006c FlashWrite +00000900 g F .text 0000001c AssertFailure +00001280 g F .text 0000001c IRQ_ISR +00000c14 g F .text 0000002c TimerUpdate +000003a0 g F .text 00000014 XcpPacketTransmitted +000002bc g F .text 00000024 ComTask +000002f8 g F .text 00000014 ComSetConnectEntryState +00000244 g F .text 0000001c BootInit +000008d4 g F .text 00000024 BackDoorInit +000008fc g F .text 00000004 CopService +000013d8 g .text 00000000 _etext +00000bf4 g F .text 00000020 TimerReset +00000260 g F .text 00000018 BootTask +00001190 g F .text 00000078 FlashWriteChecksum 40000200 g .bss 00000000 _bss_start -000003a4 g F .text 00000030 ComTransmitPacket +000002e0 g F .text 00000018 ComTransmitPacket 00000000 g .text 00000000 _startup -00000470 g F .text 00000018 XcpIsConnected -00000d80 g F .text 0000001c NvmInit -0000121c g F .text 00000018 FlashInit +00000388 g F .text 00000018 XcpIsConnected +00000b98 g F .text 00000010 NvmInit +00000fac g F .text 00000018 FlashInit 400006f4 g *ABS* 00000000 _bss_end 00000050 g .text 00000000 Reset_Handler -00000bdc g F .text 00000040 UartInit -00000db8 g F .text 0000001c NvmErase -0000049c g F .text 0000052c XcpPacketReceived -00001494 g F .text 0000005c FlashDone +00000a24 g F .text 00000040 UartInit +00000bb8 g F .text 00000010 NvmErase +000003b4 g F .text 000004d4 XcpPacketReceived +00001208 g F .text 0000005c FlashDone 00000040 g .text 00000000 EntryFromProg -000003e8 g F .text 00000010 ComIsConnectEntryState -00000448 g F .text 00000028 XcpInit -000012a0 g F .text 00000134 FlashErase -00000148 g F .text 00000130 main -00000df0 g F .text 00000034 NvmDone -00000c1c g F .text 000000a8 UartTransmitPacket -00000dd4 g F .text 0000001c NvmVerifyChecksum -00000aa4 g F .text 00000044 CpuMemCopy +0000030c g F .text 00000010 ComIsConnectEntryState +00000360 g F .text 00000028 XcpInit +00001030 g F .text 00000118 FlashErase +00000148 g F .text 000000fc main +00000bd8 g F .text 0000001c NvmDone +00000a64 g F .text 00000084 UartTransmitPacket +00000bc8 g F .text 00000010 NvmVerifyChecksum +0000091c g F .text 00000038 CpuMemCopy 40001edc g *ABS* 00000000 _stack_end -00000e70 g F .text 00000010 TimerSet -000014f0 g F .text 00000028 FIQ_ISR -00000cc4 g F .text 000000bc UartReceivePacket +00000c40 g F .text 00000010 TimerSet +00001264 g F .text 0000001c FIQ_ISR +00000ae8 g F .text 000000b0 UartReceivePacket 40000200 g .text 00000000 _data -00000a74 g F .text 00000004 CopInit -00000b38 g F .text 0000001c CpuReset +000008f8 g F .text 00000004 CopInit +00000998 g F .text 00000010 CpuReset 000000f4 g .text 00000000 SetupRAM -00000d9c g F .text 0000001c NvmWrite -00000ae8 g F .text 00000050 CpuStartUserProgram -000013d4 g F .text 00000048 FlashVerifyChecksum +00000ba8 g F .text 00000010 NvmWrite +00000954 g F .text 00000044 CpuStartUserProgram +00001148 g F .text 00000048 FlashVerifyChecksum 40000200 g .text 00000000 _edata 400006f4 g *ABS* 00000000 _end -00001540 g F .text 00000024 UNDEF_ISR -000003f8 g F .text 0000001c ComIsConnected -000009c8 g F .text 0000007c BackDoorCheck -00000ec8 g F .text 0000001c TimerGet -00000e80 g F .text 00000048 TimerInit +0000129c g F .text 00000018 UNDEF_ISR +0000031c g F .text 00000010 ComIsConnected +00000888 g F .text 0000004c BackDoorCheck +00000c98 g F .text 0000001c TimerGet +00000c50 g F .text 00000048 TimerInit diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/extflash.c b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/extflash.c new file mode 100644 index 00000000..beefab0b --- /dev/null +++ b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/extflash.c @@ -0,0 +1,643 @@ +/**************************************************************************************** +| Description: bootloader external flash driver source file +| File Name: extflash.c +| +|---------------------------------------------------------------------------------------- +| C O P Y R I G H T +|---------------------------------------------------------------------------------------- +| Copyright (c) 2011 by Feaser http://www.feaser.com All rights reserved +| +|---------------------------------------------------------------------------------------- +| L I C E N S E +|---------------------------------------------------------------------------------------- +| This file is part of OpenBLT. OpenBLT 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. +| +| OpenBLT 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 OpenBLT. +| If not, see . +| +| A special exception to the GPL is included to allow you to distribute a combined work +| that includes OpenBLT without being obliged to provide the source code for any +| proprietary components. The exception text is included at the bottom of the license +| file . +| +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "boot.h" /* bootloader generic header */ + + +#if (BOOT_NVM_HOOKS_ENABLE > 0) +/**************************************************************************************** +* Macro definitions +****************************************************************************************/ +#define FLASH_INVALID_SECTOR (0xff) +#define FLASH_INVALID_ADDRESS (0xffffffff) +#define FLASH_WRITE_BLOCK_SIZE (512) +#define FLASH_TOTAL_SECTORS (sizeof(flashLayout)/sizeof(flashLayout[0])) +/* C3 Intel flash commands */ +#define FLASH_CMD_READ_ARRAY_MODE (0xFF) +#define FLASH_CMD_READ_ID_MODE (0x90) +#define FLASH_CMD_ERASE_MODE (0x20) +#define FLASH_CMD_READ_STATUS_MODE (0x70) +#define FLASH_CMD_CHANGE_LOCK_MODE (0x60) +#define FLASH_CMD_UNLOCK_SECTOR (0xD0) +#define FLASH_CMD_LOCK_SECTOR (0x01) +#define FLASH_CMD_PROGRAM_MODE (0x40) +#define FLASH_CMD_ERASE_CONFIRM (0xD0) +#define FLASH_CMD_CLEAR_STATUS (0x50) +/* C3 Intel flash info bits */ +#define FLASH_LOCK_BIT (0x01) +#define FLASH_STATUS_READY_BIT (0x80) +/* C3 Intel flash error codes */ +#define FLASH_ERR_LOCKED (0x02) +#define FLASH_ERR_VPP_RANGE (0x08) +#define FLASH_ERR_PROGRAM (0x10) +#define FLASH_ERR_CMD_SEQ (0x10) +#define FLASH_ERR_ERASE (0x20) +/* flash operation timeout values */ +#define FLASH_ERASE_TIMEOUT ((blt_int32u)5000000) +#define FLASH_PROGRAM_TIMEOUT ((blt_int32u)1000000) +/* supported Intel C3 flash device */ +#define FLASH_DEV_MAN_ID ((blt_int16u)0x0089) +#define FLASH_DEV_ID ((blt_int16u)0x88c3) +/* address offsets for reading device information */ +#define FLASH_DEVINFO_MAN_ID ((blt_int16u)0x0000) +#define FLASH_DEVINFO_DEV_ID ((blt_int16u)0x0001) +#define FLASH_DEVINFO_LOCK_STATUS ((blt_int16u)0x0002) +/* functions implemented in a macro for run-time and codesize optimization */ +#define ExtFlashGetManID() (ExtFlashGetDeviceInfo(flashLayout[0].sector_start, \ + FLASH_DEVINFO_MAN_ID)) +#define ExtFlashGetDevID() (ExtFlashGetDeviceInfo(flashLayout[0].sector_start, \ + FLASH_DEVINFO_DEV_ID)) +#define ExtFlashGetLockStatus(base) (ExtFlashGetDeviceInfo(base, \ + FLASH_DEVINFO_LOCK_STATUS)) + + +/**************************************************************************************** +* Type definitions +****************************************************************************************/ +/* flash sector descriptor type */ +typedef struct +{ + blt_addr sector_start; /* sector start address */ + blt_int32u sector_size; /* sector size in bytes */ + blt_int8u sector_num; /* sector number */ +} tFlashSector; /* flash sector description */ + +/* programming is done per block of max FLASH_WRITE_BLOCK_SIZE. for this a flash block + * manager is implemented in this driver. this flash block manager depends on this + * flash block info structure. It holds the base address of the flash block and the + * data that should be programmed into the flash block. + */ +typedef struct +{ + blt_addr base_addr; + blt_int8u data[FLASH_WRITE_BLOCK_SIZE]; +} tFlashBlockInfo; + + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +static blt_bool ExtFlashInitBlock(tFlashBlockInfo *block, blt_addr address); +static tFlashBlockInfo *ExtFlashSwitchBlock(tFlashBlockInfo *block, blt_addr base_addr); +static blt_bool ExtFlashAddToBlock(tFlashBlockInfo *block, blt_addr address, + blt_int8u *data, blt_int16u len); +static blt_bool ExtFlashWriteBlock(tFlashBlockInfo *block); +static blt_bool ExtFlashEraseSector(blt_addr sector_base); +static blt_int16u ExtFlashGetDeviceInfo(blt_addr block_base, blt_int16u info); +static void ExtFlashLockSector(blt_addr sector_base); +static void ExtFlashUnlockSector(blt_addr sector_base); +static blt_int8u ExtFlashGetSector(blt_addr address); + + +/**************************************************************************************** +* Local constant declarations +****************************************************************************************/ +/* The current layout supports the 2MB external C3 Intel flash: + * - manufacturer id = 0x0089 + * - device id = 0x88c3 (16 Mbit bottom boot device) + * Note that what Intel calls a block in the user manual, is called a sector in this + * driver. + */ +static const tFlashSector flashLayout[] = +{ + { 0x80000000, 0x02000, 0}, /* flash sector 0 - 8 kbyte */ + { 0x80002000, 0x02000, 1}, /* flash sector 1 - 8 kbyte */ + { 0x80004000, 0x02000, 2}, /* flash sector 2 - 8 kbyte */ + { 0x80006000, 0x02000, 3}, /* flash sector 3 - 8 kbyte */ + { 0x80008000, 0x02000, 4}, /* flash sector 4 - 8 kbyte */ + { 0x8000A000, 0x02000, 5}, /* flash sector 5 - 8 kbyte */ + { 0x8000C000, 0x02000, 6}, /* flash sector 6 - 8 kbyte */ + { 0x8000E000, 0x02000, 7}, /* flash sector 7 - 8 kbyte */ + { 0x80010000, 0x10000, 8}, /* flash sector 8 - 64 kbyte */ + { 0x80020000, 0x10000, 9}, /* flash sector 9 - 64 kbyte */ + { 0x80030000, 0x10000, 10}, /* flash sector 10 - 64 kbyte */ + { 0x80040000, 0x10000, 11}, /* flash sector 11 - 64 kbyte */ + { 0x80050000, 0x10000, 12}, /* flash sector 12 - 64 kbyte */ + { 0x80060000, 0x10000, 13}, /* flash sector 13 - 64 kbyte */ + { 0x80070000, 0x10000, 14}, /* flash sector 14 - 64 kbyte */ + { 0x80080000, 0x10000, 15}, /* flash sector 15 - 64 kbyte */ + { 0x80090000, 0x10000, 16}, /* flash sector 16 - 64 kbyte */ + { 0x800A0000, 0x10000, 17}, /* flash sector 17 - 64 kbyte */ + { 0x800B0000, 0x10000, 18}, /* flash sector 18 - 64 kbyte */ + { 0x800C0000, 0x10000, 19}, /* flash sector 19 - 64 kbyte */ + { 0x800D0000, 0x10000, 20}, /* flash sector 20 - 64 kbyte */ + { 0x800E0000, 0x10000, 21}, /* flash sector 21 - 64 kbyte */ + { 0x800F0000, 0x10000, 22}, /* flash sector 22 - 64 kbyte */ + { 0x80100000, 0x10000, 23}, /* flash sector 23 - 64 kbyte */ + { 0x80110000, 0x10000, 24}, /* flash sector 24 - 64 kbyte */ + { 0x80120000, 0x10000, 25}, /* flash sector 25 - 64 kbyte */ + { 0x80130000, 0x10000, 26}, /* flash sector 26 - 64 kbyte */ + { 0x80140000, 0x10000, 27}, /* flash sector 27 - 64 kbyte */ + { 0x80150000, 0x10000, 28}, /* flash sector 28 - 64 kbyte */ + { 0x80160000, 0x10000, 29}, /* flash sector 29 - 64 kbyte */ + { 0x80170000, 0x10000, 30}, /* flash sector 30 - 64 kbyte */ + { 0x80180000, 0x10000, 31}, /* flash sector 31 - 64 kbyte */ + { 0x80190000, 0x10000, 32}, /* flash sector 32 - 64 kbyte */ + { 0x801A0000, 0x10000, 33}, /* flash sector 33 - 64 kbyte */ + { 0x801B0000, 0x10000, 34}, /* flash sector 34 - 64 kbyte */ + { 0x801C0000, 0x10000, 35}, /* flash sector 35 - 64 kbyte */ + { 0x801D0000, 0x10000, 36}, /* flash sector 36 - 64 kbyte */ + { 0x801E0000, 0x10000, 37}, /* flash sector 37 - 64 kbyte */ + { 0x801F0000, 0x10000, 38} /* flash sector 38 - 64 kbyte */ +}; + + +/**************************************************************************************** +* Local data declarations +****************************************************************************************/ +/* The smallest amount of flash that can be programmed is FLASH_WRITE_BLOCK_SIZE. A flash + * block manager is implemented in this driver and stores info in this variable. Whenever + * new data should be flashed, it is first added to a RAM buffer, which is part of this + * variable. Whenever the RAM buffer, which has the size of a flash block, is full or + * data needs to be written to a different block, the contents of the RAM buffer are + * programmed to flash. The flash block manager requires some software overhead, yet + * results is faster flash programming because data is first harvested, ideally until + * there is enough to program an entire flash block, before the flash device is actually + * operated on. + */ +static tFlashBlockInfo blockInfo; + + +/**************************************************************************************** +** NAME: ExtFlashInit +** PARAMETER: none +** RETURN VALUE: none +** DESCRIPTION: Initializes the flash driver. +** +****************************************************************************************/ +void ExtFlashInit(void) +{ + /* init the flash block info struct by setting the address to an invalid address */ + blockInfo.base_addr = FLASH_INVALID_ADDRESS; + /* check the flash device identification */ + if ((ExtFlashGetManID() != FLASH_DEV_MAN_ID) || (ExtFlashGetDevID() != FLASH_DEV_ID)) + { + ASSERT_RT(BLT_FALSE); + } +} /*** end of ExtFlashInit ***/ + + +/**************************************************************************************** +** NAME: ExtFlashWrite +** PARAMETER: addr start address +** len length in bytes +** data pointer to the data buffer. +** RETURN VALUE: BLT_NVM_OKAY if successful, BLT_NVM_NOT_IN_RANGE if the address is +** not within the supported memory range, or BLT_NVM_ERROR is the write +** operation failed. +** DESCRIPTION: Writes the data to flash. +** +****************************************************************************************/ +blt_int8u ExtFlashWrite(blt_addr addr, blt_int32u len, blt_int8u *data) +{ + /* make sure the addresses are within the flash device */ + if ( (ExtFlashGetSector(addr) == FLASH_INVALID_SECTOR) || \ + (ExtFlashGetSector(addr+len-1) == FLASH_INVALID_SECTOR) ) + { + return BLT_NVM_NOT_IN_RANGE; + } + + /* let the block manager handle it */ + if (ExtFlashAddToBlock(&blockInfo, addr, data, len) == BLT_FALSE) + { + return BLT_NVM_ERROR; + } + return BLT_NVM_OKAY; +} /*** end of FlashWrite ***/ + + +/**************************************************************************************** +** NAME: ExtFlashErase +** PARAMETER: addr start address +** len length in bytes +** RETURN VALUE: BLT_NVM_OKAY if successful, BLT_NVM_NOT_IN_RANGE if the address is +** not within the supported memory range, or BLT_NVM_ERROR is the erase +** operation failed. +** DESCRIPTION: Erases the flash memory. Note that this function also checks that no +** data is erased outside the flash memory region. +** +****************************************************************************************/ +blt_int8u ExtFlashErase(blt_addr addr, blt_int32u len) +{ + blt_int8u first_sector; + blt_int8u last_sector; + blt_int8u sectorIdx; + + /* obtain the first and last sector number */ + first_sector = ExtFlashGetSector(addr); + last_sector = ExtFlashGetSector(addr+len-1); + /* check them */ + if ( (first_sector == FLASH_INVALID_SECTOR) || (last_sector == FLASH_INVALID_SECTOR) ) + { + return BLT_NVM_NOT_IN_RANGE; + } + /* erase the sectors one-by-one */ + for (sectorIdx = first_sector; sectorIdx <= last_sector; sectorIdx++) + { + /* keep the watchdog happy */ + CopService(); + /* erase the sector */ + if (ExtFlashEraseSector(flashLayout[sectorIdx].sector_start) == BLT_FALSE) + { + return BLT_NVM_ERROR; + } + } + /* done so return the result of the operation */ + return BLT_NVM_OKAY; +} /*** end of ExtFlashErase ***/ + + +/**************************************************************************************** +** NAME: ExtFlashDone +** PARAMETER: none +** RETURN VALUE: BLT_TRUE is succesful, BLT_FALSE otherwise. +** DESCRIPTION: Finilizes the flash driver operations. +** +****************************************************************************************/ +blt_bool ExtFlashDone(void) +{ + /* check if there is still data waiting to be programmed */ + if (blockInfo.base_addr != FLASH_INVALID_ADDRESS) + { + if (ExtFlashWriteBlock(&blockInfo) == BLT_FALSE) + { + return BLT_FALSE; + } + } + /* still here so all is okay */ + return BLT_TRUE; +} /*** end of ExtFlashDone ***/ + + +/**************************************************************************************** +** NAME: ExtFlashInitBlock +** PARAMETER: block pointer to flash block info structure to operate on. +** address base address of the block data. +** RETURN VALUE: BLT_TRUE is succesful, BLT_FALSE otherwise. +** DESCRIPTION: Copies data currently in flash to the block->data and sets the +** base address. +** +****************************************************************************************/ +static blt_bool ExtFlashInitBlock(tFlashBlockInfo *block, blt_addr address) +{ + /* check address alignment */ + if ((address % FLASH_WRITE_BLOCK_SIZE) != 0) + { + return BLT_FALSE; + } + /* make sure that we are initializing a new block and not the same one */ + if (block->base_addr == address) + { + /* block already initialized, so nothing to do */ + return BLT_TRUE; + } + /* set the base address and copies the current data from flash */ + block->base_addr = address; + CpuMemCopy((blt_addr)block->data, address, FLASH_WRITE_BLOCK_SIZE); + return BLT_TRUE; +} /*** end of ExtFlashInitBlock ***/ + + +/**************************************************************************************** +** NAME: ExtFlashSwitchBlock +** PARAMETER: block pointer to flash block info structure to operate on. +** base_addr base address for the next block +** RETURN VALUE: the pointer of the block info struct that is no being used, or a NULL +** pointer in case of error. +** DESCRIPTION: Switches blocks by programming the current one and initializing the +** next. +** +****************************************************************************************/ +static tFlashBlockInfo *ExtFlashSwitchBlock(tFlashBlockInfo *block, blt_addr base_addr) +{ + /* need to switch to a new block, so program the current one and init the next */ + if (ExtFlashWriteBlock(block) == BLT_FALSE) + { + return BLT_NULL; + } + /* initialize the new block when necessary */ + if (ExtFlashInitBlock(block, base_addr) == BLT_FALSE) + { + return BLT_NULL; + } + /* still here to all is okay */ + return block; +} /*** end of ExtFlashSwitchBlock ***/ + + +/**************************************************************************************** +** NAME: ExtFlashAddToBlock +** PARAMETER: block pointer to flash block info structure to operate on. +** address flash destination address +** data pointer to the byte array with data +** len number of bytes to add to the block +** RETURN VALUE: BLT_TRUE if successful, BLT_FALSE otherwise. +** DESCRIPTION: Programming is done per block. This function adds data to the block +** that is currently collecting data to be written to flash. If the +** address is outside of the current block, the current block is written +** to flash an a new block is initialized. +** +****************************************************************************************/ +static blt_bool ExtFlashAddToBlock(tFlashBlockInfo *block, blt_addr address, + blt_int8u *data, blt_int16u len) +{ + blt_addr current_base_addr; + blt_int8u *dst; + blt_int8u *src; + + /* determine the current base address */ + current_base_addr = (address/FLASH_WRITE_BLOCK_SIZE)*FLASH_WRITE_BLOCK_SIZE; + + /* make sure the blockInfo is not uninitialized */ + if (block->base_addr == FLASH_INVALID_ADDRESS) + { + /* initialize the blockInfo struct for the current block */ + if (ExtFlashInitBlock(block, current_base_addr) == BLT_FALSE) + { + return BLT_FALSE; + } + } + /* check if the new data fits in the current block */ + if (block->base_addr != current_base_addr) + { + /* need to switch to a new block, so program the current one and init the next */ + block = ExtFlashSwitchBlock(block, current_base_addr); + if (block == BLT_NULL) + { + return BLT_FALSE; + } + } + /* add the data to the current block, but check for block overflow */ + dst = &(block->data[address - block->base_addr]); + src = data; + do + { + /* keep the watchdog happy */ + CopService(); + /* buffer overflow? */ + if ((blt_addr)(dst-&(block->data[0])) >= FLASH_WRITE_BLOCK_SIZE) + { + /* need to switch to a new block, so program the current one and init the next */ + block = ExtFlashSwitchBlock(block, current_base_addr+FLASH_WRITE_BLOCK_SIZE); + if (block == BLT_NULL) + { + return BLT_FALSE; + } + /* reset destination pointer */ + dst = &(block->data[0]); + } + /* write the data to the buffer */ + *dst = *src; + /* update pointers */ + dst++; + src++; + /* decrement byte counter */ + len--; + } + while (len > 0); + /* still here so all is good */ + return BLT_TRUE; +} /*** end of ExtFlashAddToBlock ***/ + + +/**************************************************************************************** +** NAME: ExtFlashWriteBlock +** PARAMETER: block pointer to flash block info structure to operate on. +** RETURN VALUE: BLT_TRUE if successful, BLT_FALSE otherwise. +** DESCRIPTION: Programs FLASH_WRITE_BLOCK_SIZE bytes to flash from the block->data +** array. +** +****************************************************************************************/ +static blt_bool ExtFlashWriteBlock(tFlashBlockInfo *block) +{ + volatile blt_int16u *pAddr; + volatile blt_int16u *pData; + blt_bool result = BLT_TRUE; + volatile blt_int32u timeout = 0; + + /* unlock the sector */ + ExtFlashUnlockSector(block->base_addr); + /* init pointer to valid address in the flash block */ + pAddr = (blt_int16u *)block->base_addr; + /* init pointer to start of block data */ + pData = (blt_int16u *)block->data; + /* program all block data 16-bits at a time */ + while ((blt_addr)pAddr < (block->base_addr+FLASH_WRITE_BLOCK_SIZE)) + { + /* keep the watchdog happy */ + CopService(); + /* issue program setup command */ + *pAddr = FLASH_CMD_PROGRAM_MODE; + /* write 16-bit data that is to be programmed to start programming operation */ + *pAddr = *pData; + /* check status register for completion */ + *pAddr = FLASH_CMD_READ_STATUS_MODE; + /* wait for completion or timeout */ + while( ((*pAddr & FLASH_STATUS_READY_BIT) == 0) && (timeout < FLASH_PROGRAM_TIMEOUT) ) + { + timeout++; + } + /* check for possible errors */ + if ( (timeout >= FLASH_ERASE_TIMEOUT) || \ + ((*pAddr & (FLASH_ERR_LOCKED | FLASH_ERR_VPP_RANGE | FLASH_ERR_PROGRAM))!= 0) ) + { + result = BLT_FALSE; + } + /* clear the status register */ + *pAddr = FLASH_CMD_CLEAR_STATUS; + /* increment address and data pointers */ + pAddr++; + pData++; + } + /* lock the sector. this also switches back to read array mode */ + ExtFlashLockSector(block->base_addr); + /* inform the caller about the result */ + return result; +} /*** end of ExtFlashWriteBlock ***/ + + +/**************************************************************************************** +** NAME: ExtFlashEraseSector +** PARAMETER: sector_base base address of the sector to erase. +** RETURN VALUE: BLT_TRUE is erasure was successful, BLT_FALSE otherwise. +** DESCRIPTION: Erases the flash sector. +** +****************************************************************************************/ +static blt_bool ExtFlashEraseSector(blt_addr sector_base) +{ + volatile blt_int16u *pAddr; + blt_bool result = BLT_TRUE; + volatile blt_int32u timeout = 0; + + /* unlock the sector */ + ExtFlashUnlockSector(sector_base); + /* init pointer to valid address in the flash sector */ + pAddr = (blt_int16u *)sector_base; + /* issue erase setup command */ + *pAddr = FLASH_CMD_ERASE_MODE; + /* issue erase confirm command */ + *pAddr = FLASH_CMD_ERASE_CONFIRM; + /* check status register for completion */ + *pAddr = FLASH_CMD_READ_STATUS_MODE; + /* wait for completion or timeout */ + while( ((*pAddr & FLASH_STATUS_READY_BIT) == 0) && (timeout < FLASH_ERASE_TIMEOUT) ) + { + timeout++; + } + /* check for possible errors */ + if ( (timeout >= FLASH_ERASE_TIMEOUT) || \ + ((*pAddr & (FLASH_ERR_LOCKED | FLASH_ERR_VPP_RANGE | FLASH_ERR_ERASE))!= 0) ) + { + result = BLT_FALSE; + } + /* clear the status register */ + *pAddr = FLASH_CMD_CLEAR_STATUS; + /* lock the sector. this also switches back to read array mode */ + ExtFlashLockSector(sector_base); + /* inform the caller about the result */ + return result; +} /*** end of ExtFlashEraseSector ***/ + + +/**************************************************************************************** +** NAME: ExtFlashLockSector +** PARAMETER: sector_base base address of the sector to lock. +** RETURN VALUE: none +** DESCRIPTION: Locks the flash sector. +** +****************************************************************************************/ +static void ExtFlashLockSector(blt_addr sector_base) +{ + volatile blt_int16u *pAddr; + + /* no need to lock a sector that is already locked */ + if ((ExtFlashGetLockStatus(sector_base) & FLASH_LOCK_BIT) != 0) + { + return; + } + /* init pointer to valid address in the flash sector */ + pAddr = (blt_int16u *)sector_base; + /* switch to change lock mode */ + *pAddr = FLASH_CMD_CHANGE_LOCK_MODE; + /* unlock the sector */ + *pAddr = FLASH_CMD_LOCK_SECTOR; + /* check that the sector is now actually locked */ + ASSERT_RT((ExtFlashGetLockStatus(sector_base) & FLASH_LOCK_BIT) != 0); +} /*** end of ExtFlashLockSector ***/ + + +/**************************************************************************************** +** NAME: ExtFlashUnlockSector +** PARAMETER: sector_base base address of the sector to unlock. +** RETURN VALUE: none +** DESCRIPTION: Unlocks the flash sector. +** +****************************************************************************************/ +static void ExtFlashUnlockSector(blt_addr sector_base) +{ + volatile blt_int16u *pAddr; + + /* no need to unlock a sector that is already unlocked */ + if ((ExtFlashGetLockStatus(sector_base) & FLASH_LOCK_BIT) == 0) + { + return; + } + /* init pointer to valid address in the flash sector */ + pAddr = (blt_int16u *)sector_base; + /* switch to change lock mode */ + *pAddr = FLASH_CMD_CHANGE_LOCK_MODE; + /* unlock the sector */ + *pAddr = FLASH_CMD_UNLOCK_SECTOR; + /* check that the sector is now actually unlocked */ + ASSERT_RT((ExtFlashGetLockStatus(sector_base) & FLASH_LOCK_BIT) == 0); +} /*** end of ExtFlashUnlockSector ***/ + + +/**************************************************************************************** +** NAME: ExtFlashGetDeviceInfo +** PARAMETER: sector_base base address of the sector to get the info from. +** info identifier to the type of info to obtain. +** RETURN VALUE: device info. +** DESCRIPTION: Obtains device information from the flash device. +** +****************************************************************************************/ +static blt_int16u ExtFlashGetDeviceInfo(blt_addr sector_base, blt_int16u info) +{ + volatile blt_int16u *pAddr; + blt_int16u readData; + + /* init pointer to any valid address in the flash device */ + pAddr = (blt_int16u *)sector_base + info; + /* switch to read identifier mode */ + *pAddr = FLASH_CMD_READ_ID_MODE; + /* read the info */ + readData = *pAddr; + /* switch back to reading mode */ + *pAddr = FLASH_CMD_READ_ARRAY_MODE; + /* return the result */ + return readData; +} /*** end of ExtFlashGetDeviceInfo ***/ + + +/**************************************************************************************** +** NAME: ExtFlashGetSector +** PARAMETER: address address in the flash sector +** RETURN VALUE: flash sector number or FLASH_INVALID_SECTOR +** DESCRIPTION: Determines the flash sector the address is in. +** +****************************************************************************************/ +static blt_int8u ExtFlashGetSector(blt_addr address) +{ + blt_int8u sectorIdx; + + /* search through the sectors to find the right one */ + for (sectorIdx = 0; sectorIdx < FLASH_TOTAL_SECTORS; sectorIdx++) + { + /* keep the watchdog happy */ + CopService(); + /* is the address in this sector? */ + if ( (address >= flashLayout[sectorIdx].sector_start) && \ + (address < (flashLayout[sectorIdx].sector_start + \ + flashLayout[sectorIdx].sector_size)) ) + { + /* return the sector number */ + return flashLayout[sectorIdx].sector_num; + } + } + /* still here so no valid sector found */ + return FLASH_INVALID_SECTOR; +} /*** end of ExtFlashGetSector ***/ +#endif + +/*********************************** end of extflash.c *********************************/ diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/extflash.h b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/extflash.h new file mode 100644 index 00000000..bc8c4b15 --- /dev/null +++ b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/extflash.h @@ -0,0 +1,45 @@ +/**************************************************************************************** +| Description: bootloader external flash driver header file +| File Name: extflash.h +| +|---------------------------------------------------------------------------------------- +| C O P Y R I G H T +|---------------------------------------------------------------------------------------- +| Copyright (c) 2011 by Feaser http://www.feaser.com All rights reserved +| +|---------------------------------------------------------------------------------------- +| L I C E N S E +|---------------------------------------------------------------------------------------- +| This file is part of OpenBLT. OpenBLT 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. +| +| OpenBLT 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 OpenBLT. +| If not, see . +| +| A special exception to the GPL is included to allow you to distribute a combined work +| that includes OpenBLT without being obliged to provide the source code for any +| proprietary components. The exception text is included at the bottom of the license +| file . +| +****************************************************************************************/ +#ifndef EXTFLASH_H +#define EXTFLASH_H + +#if (BOOT_NVM_HOOKS_ENABLE > 0) +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +void ExtFlashInit(void); +blt_int8u ExtFlashWrite(blt_addr addr, blt_int32u len, blt_int8u *data); +blt_int8u ExtFlashErase(blt_addr addr, blt_int32u len); +blt_bool ExtFlashDone(void); +#endif + +#endif /* EXTFLASH_H */ +/*********************************** end of extflash.h *********************************/ diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/hooks.c b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/hooks.c index e46906ec..8bbaedb6 100644 --- a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/hooks.c +++ b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/hooks.c @@ -80,6 +80,7 @@ blt_bool BackDoorEntryHook(void) ****************************************************************************************/ #if (BOOT_NVM_HOOKS_ENABLE > 0) +#include "extflash.h" /**************************************************************************************** ** NAME: NvmInitHook ** PARAMETER: none @@ -90,6 +91,8 @@ blt_bool BackDoorEntryHook(void) ****************************************************************************************/ void NvmInitHook(void) { + /* init the external flash driver */ + ExtFlashInit(); } /*** end of NvmInitHook ***/ @@ -98,20 +101,21 @@ void NvmInitHook(void) ** PARAMETER: addr start address ** len length in bytes ** data pointer to the data buffer. -** RETURN VALUE: BTL_NVM_OKAY if successful, BTL_NVM_NOT_IN_RANGE if the address is -** not within the supported memory range, or BTL_NVM_ERROR is the write +** RETURN VALUE: BLT_NVM_OKAY if successful, BLT_NVM_NOT_IN_RANGE if the address is +** not within the supported memory range, or BLT_NVM_ERROR is the write ** operation failed. ** DESCRIPTION: Callback that gets called at the start of the NVM driver write ** routine. It allows additional memory to be operated on. If the address ** is not within the range of the additional memory, then -** BTL_NVM_NOT_IN_RANGE must be returned to indicate that the data hasn't +** BLT_NVM_NOT_IN_RANGE must be returned to indicate that the data hasn't ** been written yet. ** ** ****************************************************************************************/ blt_int8u NvmWriteHook(blt_addr addr, blt_int32u len, blt_int8u *data) { - return BTL_NVM_NOT_IN_RANGE; + /* attempt to write with the external flash driver */ + return ExtFlashWrite(addr, len, data); } /*** end of NvmWriteHook ***/ @@ -119,19 +123,20 @@ blt_int8u NvmWriteHook(blt_addr addr, blt_int32u len, blt_int8u *data) ** NAME: NvmEraseHook ** PARAMETER: addr start address ** len length in bytes -** RETURN VALUE: BTL_NVM_OKAY if successful, BTL_NVM_NOT_IN_RANGE if the address is -** not within the supported memory range, or BTL_NVM_ERROR is the erase +** RETURN VALUE: BLT_NVM_OKAY if successful, BLT_NVM_NOT_IN_RANGE if the address is +** not within the supported memory range, or BLT_NVM_ERROR is the erase ** operation failed. ** DESCRIPTION: Callback that gets called at the start of the NVM driver erase ** routine. It allows additional memory to be operated on. If the address ** is not within the range of the additional memory, then -** BTL_NVM_NOT_IN_RANGE must be returned to indicate that the memory +** BLT_NVM_NOT_IN_RANGE must be returned to indicate that the memory ** hasn't been erased yet. ** ****************************************************************************************/ -blt_bool NvmEraseHook(blt_addr addr, blt_int32u len) +blt_int8u NvmEraseHook(blt_addr addr, blt_int32u len) { - return BTL_NVM_NOT_IN_RANGE; + /* attempt to erase with the external flash driver */ + return ExtFlashErase(addr, len); } /*** end of NvmEraseHook ***/ @@ -144,7 +149,8 @@ blt_bool NvmEraseHook(blt_addr addr, blt_int32u len) ****************************************************************************************/ blt_bool NvmDoneHook(void) { - return BLT_TRUE; + /* finish up the operations of the external flash driver */ + return ExtFlashDone(); } /*** end of NvmDoneHook ***/ #endif /* BOOT_NVM_HOOKS_ENABLE > 0 */ diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/ide/DemoBoot.project b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/ide/DemoBoot.project index d496df15..23ad2541 100644 --- a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/ide/DemoBoot.project +++ b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/ide/DemoBoot.project @@ -47,6 +47,8 @@ + + diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/main.c b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/main.c index 60596f77..ad2b0cb7 100644 --- a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/main.c +++ b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/main.c @@ -80,7 +80,7 @@ int main(void) static void Init(void) { blt_int8u m_sel; /* pll multiplier register value */ - blt_int8u pll_dividers[] = { 1, 2, 4, 8 }; /* possible pll dividers */ + static blt_int8u pll_dividers[] = { 1, 2, 4, 8 }; /* possible pll dividers */ blt_int8u p_sel_cnt; /* loop counter to find p_sel */ blt_int32u f_cco; /* current controller oscillator */ @@ -144,6 +144,29 @@ static void Init(void) MAMCR = 0x2; /* setting peripheral Clock (pclk) to System Clock (cclk) */ VPBDIV = 0x1; +#if (BOOT_NVM_HOOKS_ENABLE > 0) + /* in this the external memory on the Olimex LPC-L2294 board is used so configure + * the memory banks for the external flash EEPROM and RAM + */ + /* external flash EEPROM: + * IDCY=3 (idle timing) + * WST1=4 (read timing) + * RBLE=1 + * WST2=6 (write timing) + * MW=1 (16-bit data bus) + */ + BCFG0 = (0x3 << 0) | (0x4 << 5) | (0x1 << 10) | (0x6 << 11) | (0x1 << 28); + /* external RAM: + * IDCY=0 (idle timing) + * WST1=0 (read timing) + * RBLE=1 + * WST2=0 (write timing) + * MW=2 (32-bit data bus) + */ + BCFG1 = (0x0 << 0) | (0x0 << 5) | (0x1 << 10) | (0x0 << 11) | (0x2 << 28); + /* configure use of data bus and strobe pins for the external memory */ + PINSEL2 = 0x0F000924; +#endif #if (BOOT_COM_UART_ENABLE > 0) /* configure P0.0 for UART0 Tx and P0.1 for UART0 Rx functionality */ PINSEL0 |= 0x05; diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/makefile b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/makefile index 40744340..b510d89a 100644 --- a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/makefile +++ b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/makefile @@ -38,6 +38,8 @@ PROJ_FILES= \ config.h \ hooks.c \ main.c \ +extflash.c \ +extflash.h \ lpc2294.h \ ../../../Source/boot.c \ ../../../Source/boot.h \ @@ -105,7 +107,7 @@ LIB_PATH = -L../../../Source/ARM7_LPC2000/GCC/ #| Options for compiler binaries | #|---------------------------------------------------------------------------------------| AFLAGS = -ahls -mapcs-32 -mcpu=arm7tdmi-s -mfpu=softfpa -CFLAGS = $(INC_PATH) -O1 -Wall -fmessage-length=0 -mcpu=arm7tdmi-s -g -mlong-calls +CFLAGS = $(INC_PATH) -O1 -Wall -fmessage-length=0 -mcpu=arm7tdmi-s -g CFLAGS += -Wa,-adhlns="$(OBJ_PATH)/$(subst .o,.lst,$@)" LFLAGS = $(LIB_PATH) -T"memory.x" -g -mcpu=arm7tdmi-s -nostartfiles OCFLAGS = -O ihex diff --git a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/bin/openbtl_olimex_stm32p103.elf b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/bin/openbtl_olimex_stm32p103.elf index 048c384359b0da2151513594f1d2af0657ef1bb7..ccec1ad28a034762266f8588b97fcc852788241d 100644 GIT binary patch literal 48500 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 literal 47508 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 B!<+yB diff --git a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/bin/openbtl_olimex_stm32p103.map b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/bin/openbtl_olimex_stm32p103.map index 8a34685c..a981dabf 100644 --- a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/bin/openbtl_olimex_stm32p103.map +++ b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/bin/openbtl_olimex_stm32p103.map @@ -19,50 +19,50 @@ Discarded input sections .text.__get_PSP 0x00000000 0x8 THUMB Debug/../../obj/core_cm3.o .text.__set_PSP - 0x00000000 0x6 THUMB Debug/../../obj/core_cm3.o + 0x00000000 0x8 THUMB Debug/../../obj/core_cm3.o .text.__get_MSP 0x00000000 0x8 THUMB Debug/../../obj/core_cm3.o .text.__set_MSP - 0x00000000 0x6 THUMB Debug/../../obj/core_cm3.o + 0x00000000 0x8 THUMB Debug/../../obj/core_cm3.o .text.__get_BASEPRI - 0x00000000 0x6 THUMB Debug/../../obj/core_cm3.o + 0x00000000 0x8 THUMB Debug/../../obj/core_cm3.o .text.__set_BASEPRI - 0x00000000 0x6 THUMB Debug/../../obj/core_cm3.o + 0x00000000 0x8 THUMB Debug/../../obj/core_cm3.o .text.__get_PRIMASK - 0x00000000 0x6 THUMB Debug/../../obj/core_cm3.o + 0x00000000 0x8 THUMB Debug/../../obj/core_cm3.o .text.__set_PRIMASK - 0x00000000 0x6 THUMB Debug/../../obj/core_cm3.o + 0x00000000 0x8 THUMB Debug/../../obj/core_cm3.o .text.__get_FAULTMASK - 0x00000000 0x6 THUMB Debug/../../obj/core_cm3.o + 0x00000000 0x8 THUMB Debug/../../obj/core_cm3.o .text.__set_FAULTMASK - 0x00000000 0x6 THUMB Debug/../../obj/core_cm3.o + 0x00000000 0x8 THUMB Debug/../../obj/core_cm3.o .text.__get_CONTROL - 0x00000000 0x6 THUMB Debug/../../obj/core_cm3.o + 0x00000000 0x8 THUMB Debug/../../obj/core_cm3.o .text.__set_CONTROL - 0x00000000 0x6 THUMB Debug/../../obj/core_cm3.o + 0x00000000 0x8 THUMB Debug/../../obj/core_cm3.o .text.__REV 0x00000000 0x4 THUMB Debug/../../obj/core_cm3.o .text.__REV16 0x00000000 0x4 THUMB Debug/../../obj/core_cm3.o .text.__REVSH 0x00000000 0x4 THUMB Debug/../../obj/core_cm3.o - .text.__RBIT 0x00000000 0x6 THUMB Debug/../../obj/core_cm3.o + .text.__RBIT 0x00000000 0x8 THUMB Debug/../../obj/core_cm3.o .text.__LDREXB 0x00000000 0x8 THUMB Debug/../../obj/core_cm3.o .text.__LDREXH 0x00000000 0x8 THUMB Debug/../../obj/core_cm3.o .text.__LDREXW - 0x00000000 0x6 THUMB Debug/../../obj/core_cm3.o + 0x00000000 0x8 THUMB Debug/../../obj/core_cm3.o .text.__STREXB - 0x00000000 0x6 THUMB Debug/../../obj/core_cm3.o + 0x00000000 0x8 THUMB Debug/../../obj/core_cm3.o .text.__STREXH - 0x00000000 0x6 THUMB Debug/../../obj/core_cm3.o + 0x00000000 0x8 THUMB Debug/../../obj/core_cm3.o .text.__STREXW - 0x00000000 0x6 THUMB Debug/../../obj/core_cm3.o + 0x00000000 0x8 THUMB Debug/../../obj/core_cm3.o .text 0x00000000 0x0 THUMB Debug/../../obj/system_stm32f10x.o .data 0x00000000 0x0 THUMB Debug/../../obj/system_stm32f10x.o .bss 0x00000000 0x0 THUMB Debug/../../obj/system_stm32f10x.o .text.SystemInit - 0x00000000 0xf8 THUMB Debug/../../obj/system_stm32f10x.o + 0x00000000 0x130 THUMB Debug/../../obj/system_stm32f10x.o .text.SystemCoreClockUpdate - 0x00000000 0x64 THUMB Debug/../../obj/system_stm32f10x.o + 0x00000000 0xe0 THUMB Debug/../../obj/system_stm32f10x.o .data.AHBPrescTable 0x00000000 0x10 THUMB Debug/../../obj/system_stm32f10x.o .data.SystemCoreClock @@ -89,8 +89,6 @@ Discarded input sections .text 0x00000000 0x0 THUMB Debug/../../obj/timer.o .data 0x00000000 0x0 THUMB Debug/../../obj/timer.o .bss 0x00000000 0x0 THUMB Debug/../../obj/timer.o - .text.TimerSet - 0x00000000 0xc THUMB Debug/../../obj/timer.o .text 0x00000000 0x0 THUMB Debug/../../obj/uart.o .data 0x00000000 0x0 THUMB Debug/../../obj/uart.o .bss 0x00000000 0x0 THUMB Debug/../../obj/uart.o @@ -164,7 +162,7 @@ CM3_System_Control_Space 0xe000e000 0x00001000 xw Linker script and memory map - 0x08000d70 __do_debug_operation = __do_debug_operation_bkpt + 0x0800122c __do_debug_operation = __do_debug_operation_bkpt 0x08000000 __FLASH_segment_start__ = 0x8000000 0x08004000 __FLASH_segment_end__ = 0x8004000 0x20000000 __RAM_segment_start__ = 0x20000000 @@ -213,146 +211,159 @@ Linker script and memory map 0x00000001 . = ASSERT (((__init_end__ >= __FLASH_segment_start__) && (__init_end__ <= (__FLASH_segment_start__ + 0x20000))), error: .init is too large to fit in FLASH memory segment) 0x080002e8 __text_load_start__ = ALIGN (__init_end__, 0x4) -.text 0x080002e8 0xaa8 +.text 0x080002e8 0xf64 0x080002e8 __text_start__ = . *(.text .text.* .glue_7t .glue_7 .gnu.linkonce.t.* .gcc_except_table .ARM.extab* .gnu.linkonce.armextab.*) .glue_7 0x00000000 0x0 linker stubs .glue_7t 0x00000000 0x0 linker stubs - .text.startup.main - 0x080002e8 0x12c THUMB Debug/../../obj/main.o + .text.main 0x080002e8 0x170 THUMB Debug/../../obj/main.o 0x080002e8 main .text.UnusedISR - 0x08000414 0xc THUMB Debug/../../obj/vectors.o - 0x08000414 UnusedISR + 0x08000458 0x18 THUMB Debug/../../obj/vectors.o + 0x08000458 UnusedISR .text.CpuStartUserProgram - 0x08000420 0x24 THUMB Debug/../../obj/cpu.o - 0x08000420 CpuStartUserProgram + 0x08000470 0x28 THUMB Debug/../../obj/cpu.o + 0x08000470 CpuStartUserProgram .text.CpuMemCopy - 0x08000444 0x20 THUMB Debug/../../obj/cpu.o - 0x08000444 CpuMemCopy + 0x08000498 0x28 THUMB Debug/../../obj/cpu.o + 0x08000498 CpuMemCopy .text.CpuReset - 0x08000464 0x4 THUMB Debug/../../obj/cpu.o - 0x08000464 CpuReset - .text.NvmInit 0x08000468 0x4 THUMB Debug/../../obj/nvm.o - 0x08000468 NvmInit + 0x080004c0 0xc THUMB Debug/../../obj/cpu.o + 0x080004c0 CpuReset + .text.NvmInit 0x080004cc 0xc THUMB Debug/../../obj/nvm.o + 0x080004cc NvmInit .text.NvmWrite - 0x0800046c 0x4 THUMB Debug/../../obj/nvm.o - 0x0800046c NvmWrite + 0x080004d8 0xc THUMB Debug/../../obj/nvm.o + 0x080004d8 NvmWrite .text.NvmErase - 0x08000470 0x4 THUMB Debug/../../obj/nvm.o - 0x08000470 NvmErase + 0x080004e4 0xc THUMB Debug/../../obj/nvm.o + 0x080004e4 NvmErase .text.NvmVerifyChecksum - 0x08000474 0x4 THUMB Debug/../../obj/nvm.o - 0x08000474 NvmVerifyChecksum - .text.NvmDone 0x08000478 0x14 THUMB Debug/../../obj/nvm.o - 0x08000478 NvmDone - .text.TimerInit - 0x0800048c 0x24 THUMB Debug/../../obj/timer.o - 0x0800048c TimerInit + 0x080004f0 0xc THUMB Debug/../../obj/nvm.o + 0x080004f0 NvmVerifyChecksum + .text.NvmDone 0x080004fc 0x18 THUMB Debug/../../obj/nvm.o + 0x080004fc NvmDone .text.TimerReset - 0x080004b0 0xc THUMB Debug/../../obj/timer.o - 0x080004b0 TimerReset + 0x08000514 0x10 THUMB Debug/../../obj/timer.o + 0x08000514 TimerReset .text.TimerUpdate - 0x080004bc 0x1c THUMB Debug/../../obj/timer.o - 0x080004bc TimerUpdate + 0x08000524 0x24 THUMB Debug/../../obj/timer.o + 0x08000524 TimerUpdate + .text.TimerSet + 0x08000548 0xc THUMB Debug/../../obj/timer.o + 0x08000548 TimerSet + .text.TimerInit + 0x08000554 0x2c THUMB Debug/../../obj/timer.o + 0x08000554 TimerInit .text.TimerGet - 0x080004d8 0x14 THUMB Debug/../../obj/timer.o - 0x080004d8 TimerGet + 0x08000580 0x14 THUMB Debug/../../obj/timer.o + 0x08000580 TimerGet + .text.UartReceiveByte + 0x08000594 0x24 THUMB Debug/../../obj/uart.o + .text.UartTransmitByte + 0x080005b8 0x4c THUMB Debug/../../obj/uart.o .text.UartInit - 0x080004ec 0x28 THUMB Debug/../../obj/uart.o - 0x080004ec UartInit + 0x08000604 0x2c THUMB Debug/../../obj/uart.o + 0x08000604 UartInit .text.UartTransmitPacket - 0x08000514 0x7c THUMB Debug/../../obj/uart.o - 0x08000514 UartTransmitPacket + 0x08000630 0x70 THUMB Debug/../../obj/uart.o + 0x08000630 UartTransmitPacket .text.UartReceivePacket - 0x08000590 0x6c THUMB Debug/../../obj/uart.o - 0x08000590 UartReceivePacket + 0x080006a0 0xb0 THUMB Debug/../../obj/uart.o + 0x080006a0 UartReceivePacket + .text.FlashUnlock + 0x08000750 0x24 THUMB Debug/../../obj/flash.o .text.FlashLock - 0x080005fc 0x10 THUMB Debug/../../obj/flash.o + 0x08000774 0x14 THUMB Debug/../../obj/flash.o .text.FlashGetSector - 0x0800060c 0x38 THUMB Debug/../../obj/flash.o + 0x08000788 0x48 THUMB Debug/../../obj/flash.o .text.FlashWriteBlock - 0x08000644 0xa0 THUMB Debug/../../obj/flash.o + 0x080007d0 0xc4 THUMB Debug/../../obj/flash.o + .text.FlashGetSectorBaseAddr + 0x08000894 0x40 THUMB Debug/../../obj/flash.o + .text.FlashInitBlock + 0x080008d4 0x38 THUMB Debug/../../obj/flash.o .text.FlashSwitchBlock - 0x080006e4 0x54 THUMB Debug/../../obj/flash.o + 0x0800090c 0x50 THUMB Debug/../../obj/flash.o .text.FlashAddToBlock - 0x08000738 0x8a THUMB Debug/../../obj/flash.o - *fill* 0x080007c2 0x2 00 + 0x0800095c 0xa0 THUMB Debug/../../obj/flash.o .text.FlashInit - 0x080007c4 0x18 THUMB Debug/../../obj/flash.o - 0x080007c4 FlashInit + 0x080009fc 0x1c THUMB Debug/../../obj/flash.o + 0x080009fc FlashInit .text.FlashWrite - 0x080007dc 0x4c THUMB Debug/../../obj/flash.o - 0x080007dc FlashWrite + 0x08000a18 0x58 THUMB Debug/../../obj/flash.o + 0x08000a18 FlashWrite .text.FlashErase - 0x08000828 0x13c THUMB Debug/../../obj/flash.o - 0x08000828 FlashErase + 0x08000a70 0x144 THUMB Debug/../../obj/flash.o + 0x08000a70 FlashErase .text.FlashVerifyChecksum - 0x08000964 0x54 THUMB Debug/../../obj/flash.o - 0x08000964 FlashVerifyChecksum + 0x08000bb4 0x68 THUMB Debug/../../obj/flash.o + 0x08000bb4 FlashVerifyChecksum .text.FlashWriteChecksum - 0x080009b8 0x44 THUMB Debug/../../obj/flash.o - 0x080009b8 FlashWriteChecksum + 0x08000c1c 0x50 THUMB Debug/../../obj/flash.o + 0x08000c1c FlashWriteChecksum .text.FlashDone - 0x080009fc 0x34 THUMB Debug/../../obj/flash.o - 0x080009fc FlashDone + 0x08000c6c 0x58 THUMB Debug/../../obj/flash.o + 0x08000c6c FlashDone .text.AssertFailure - 0x08000a30 0x18 THUMB Debug/../../obj/assert.o - 0x08000a30 AssertFailure + 0x08000cc4 0x1c THUMB Debug/../../obj/assert.o + 0x08000cc4 AssertFailure .text.BackDoorCheck - 0x08000a48 0x30 THUMB Debug/../../obj/backdoor.o - 0x08000a48 BackDoorCheck + 0x08000ce0 0x3c THUMB Debug/../../obj/backdoor.o + 0x08000ce0 BackDoorCheck .text.BackDoorInit - 0x08000a78 0x18 THUMB Debug/../../obj/backdoor.o - 0x08000a78 BackDoorInit + 0x08000d1c 0x1c THUMB Debug/../../obj/backdoor.o + 0x08000d1c BackDoorInit .text.BootInit - 0x08000a90 0x16 THUMB Debug/../../obj/boot.o - 0x08000a90 BootInit + 0x08000d38 0x18 THUMB Debug/../../obj/boot.o + 0x08000d38 BootInit .text.BootTask - 0x08000aa6 0x12 THUMB Debug/../../obj/boot.o - 0x08000aa6 BootTask - .text.ComInit 0x08000ab8 0x2c THUMB Debug/../../obj/com.o - 0x08000ab8 ComInit - .text.ComTask 0x08000ae4 0x20 THUMB Debug/../../obj/com.o - 0x08000ae4 ComTask + 0x08000d50 0x14 THUMB Debug/../../obj/boot.o + 0x08000d50 BootTask + .text.ComInit 0x08000d64 0x34 THUMB Debug/../../obj/com.o + 0x08000d64 ComInit + .text.ComTask 0x08000d98 0x24 THUMB Debug/../../obj/com.o + 0x08000d98 ComTask .text.ComTransmitPacket - 0x08000b04 0x10 THUMB Debug/../../obj/com.o - 0x08000b04 ComTransmitPacket + 0x08000dbc 0x10 THUMB Debug/../../obj/com.o + 0x08000dbc ComTransmitPacket .text.ComSetConnectEntryState - 0x08000b14 0xc THUMB Debug/../../obj/com.o - 0x08000b14 ComSetConnectEntryState + 0x08000dcc 0x10 THUMB Debug/../../obj/com.o + 0x08000dcc ComSetConnectEntryState .text.ComIsConnected - 0x08000b20 0x4 THUMB Debug/../../obj/com.o - 0x08000b20 ComIsConnected - .text.CopInit 0x08000b24 0x2 THUMB Debug/../../obj/cop.o - 0x08000b24 CopInit + 0x08000ddc 0xc THUMB Debug/../../obj/com.o + 0x08000ddc ComIsConnected + .text.CopInit 0x08000de8 0x4 THUMB Debug/../../obj/cop.o + 0x08000de8 CopInit .text.CopService - 0x08000b26 0x2 THUMB Debug/../../obj/cop.o - 0x08000b26 CopService + 0x08000dec 0x4 THUMB Debug/../../obj/cop.o + 0x08000dec CopService + .text.XcpProtectResources + 0x08000df0 0x10 THUMB Debug/../../obj/xcp.o .text.XcpSetCtoError - 0x08000b28 0x14 THUMB Debug/../../obj/xcp.o - .text.XcpInit 0x08000b3c 0x1c THUMB Debug/../../obj/xcp.o - 0x08000b3c XcpInit + 0x08000e00 0x1c THUMB Debug/../../obj/xcp.o + .text.XcpInit 0x08000e1c 0x20 THUMB Debug/../../obj/xcp.o + 0x08000e1c XcpInit .text.XcpIsConnected - 0x08000b58 0x10 THUMB Debug/../../obj/xcp.o - 0x08000b58 XcpIsConnected + 0x08000e3c 0x14 THUMB Debug/../../obj/xcp.o + 0x08000e3c XcpIsConnected .text.XcpPacketTransmitted - 0x08000b68 0x10 THUMB Debug/../../obj/xcp.o - 0x08000b68 XcpPacketTransmitted + 0x08000e50 0x14 THUMB Debug/../../obj/xcp.o + 0x08000e50 XcpPacketTransmitted .text.XcpPacketReceived - 0x08000b78 0x1f8 THUMB Debug/../../obj/xcp.o - 0x08000b78 XcpPacketReceived + 0x08000e64 0x3c8 THUMB Debug/../../obj/xcp.o + 0x08000e64 XcpPacketReceived .text.libdebugio_bkpt.__do_debug_operation_bkpt - 0x08000d70 0x18 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libdebugio_v7m_t_le.a(libdebugio_asm.o) - 0x08000d70 __do_debug_operation_bkpt + 0x0800122c 0x18 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libdebugio_v7m_t_le.a(libdebugio_asm.o) + 0x0800122c __do_debug_operation_bkpt .text.libc.__debug_io_lock - 0x08000d88 0x4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libc_user_libc_v7m_t_le.a(user_libc.o) - 0x08000d88 __debug_io_lock + 0x08001244 0x4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + 0x08001244 __debug_io_lock .text.libc.__debug_io_unlock - 0x08000d8c 0x4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libc_user_libc_v7m_t_le.a(user_libc.o) - 0x08000d8c __debug_io_unlock - 0x08000d90 __text_end__ = (__text_start__ + SIZEOF (.text)) - 0x08000d90 __text_load_end__ = __text_end__ + 0x08001248 0x4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + 0x08001248 __debug_io_unlock + 0x0800124c __text_end__ = (__text_start__ + SIZEOF (.text)) + 0x0800124c __text_load_end__ = __text_end__ .vfp11_veneer 0x00000000 0x0 .vfp11_veneer 0x00000000 0x0 linker stubs @@ -360,62 +371,65 @@ Linker script and memory map .v4_bx 0x00000000 0x0 .v4_bx 0x00000000 0x0 linker stubs 0x00000001 . = ASSERT (((__text_end__ >= __FLASH_segment_start__) && (__text_end__ <= (__FLASH_segment_start__ + 0x20000))), error: .text is too large to fit in FLASH memory segment) - 0x08000d90 __dtors_load_start__ = ALIGN (__text_end__, 0x4) + 0x0800124c __dtors_load_start__ = ALIGN (__text_end__, 0x4) -.dtors 0x08000d90 0x0 - 0x08000d90 __dtors_start__ = . +.dtors 0x0800124c 0x0 + 0x0800124c __dtors_start__ = . *(SORT(.dtors.*)) *(.dtors) *(.fini_array .fini_array.*) - 0x08000d90 __dtors_end__ = (__dtors_start__ + SIZEOF (.dtors)) - 0x08000d90 __dtors_load_end__ = __dtors_end__ + 0x0800124c __dtors_end__ = (__dtors_start__ + SIZEOF (.dtors)) + 0x0800124c __dtors_load_end__ = __dtors_end__ 0x00000001 . = ASSERT (((__dtors_end__ >= __FLASH_segment_start__) && (__dtors_end__ <= (__FLASH_segment_start__ + 0x20000))), error: .dtors is too large to fit in FLASH memory segment) - 0x08000d90 __ctors_load_start__ = ALIGN (__dtors_end__, 0x4) + 0x0800124c __ctors_load_start__ = ALIGN (__dtors_end__, 0x4) -.ctors 0x08000d90 0x0 - 0x08000d90 __ctors_start__ = . +.ctors 0x0800124c 0x0 + 0x0800124c __ctors_start__ = . *(SORT(.ctors.*)) *(.ctors) *(.init_array .init_array.*) - 0x08000d90 __ctors_end__ = (__ctors_start__ + SIZEOF (.ctors)) - 0x08000d90 __ctors_load_end__ = __ctors_end__ + 0x0800124c __ctors_end__ = (__ctors_start__ + SIZEOF (.ctors)) + 0x0800124c __ctors_load_end__ = __ctors_end__ 0x00000001 . = ASSERT (((__ctors_end__ >= __FLASH_segment_start__) && (__ctors_end__ <= (__FLASH_segment_start__ + 0x20000))), error: .ctors is too large to fit in FLASH memory segment) - 0x08000d90 __rodata_load_start__ = ALIGN (__ctors_end__, 0x4) + 0x0800124c __rodata_load_start__ = ALIGN (__ctors_end__, 0x4) -.rodata 0x08000d90 0x23c - 0x08000d90 __rodata_start__ = . +.rodata 0x0800124c 0x23c + 0x0800124c __rodata_start__ = . *(.rodata .rodata.* .gnu.linkonce.r.*) - .rodata.str1.1 - 0x08000d90 0x67 THUMB Debug/../../obj/main.o - .rodata.str1.1 - 0x08000df7 0x92 THUMB Debug/../../obj/vectors.o - .rodata.str1.1 - 0x08000e89 0x84 THUMB Debug/../../obj/uart.o - *fill* 0x08000f0d 0x3 00 + .rodata.str1.4 + 0x0800124c 0x67 THUMB Debug/../../obj/main.o + 0x68 (size before relaxing) + *fill* 0x080012b3 0x1 00 + .rodata.str1.4 + 0x080012b4 0x92 THUMB Debug/../../obj/vectors.o + 0x94 (size before relaxing) + *fill* 0x08001346 0x2 00 + .rodata.str1.4 + 0x08001348 0x84 THUMB Debug/../../obj/uart.o .rodata.flashLayout - 0x08000f10 0xb4 THUMB Debug/../../obj/flash.o + 0x080013cc 0xb4 THUMB Debug/../../obj/flash.o .rodata.xcpStationId - 0x08000fc4 0x8 THUMB Debug/../../obj/xcp.o - 0x08000fcc __rodata_end__ = (__rodata_start__ + SIZEOF (.rodata)) - 0x08000fcc __rodata_load_end__ = __rodata_end__ + 0x08001480 0x8 THUMB Debug/../../obj/xcp.o + 0x08001488 __rodata_end__ = (__rodata_start__ + SIZEOF (.rodata)) + 0x08001488 __rodata_load_end__ = __rodata_end__ 0x00000001 . = ASSERT (((__rodata_end__ >= __FLASH_segment_start__) && (__rodata_end__ <= (__FLASH_segment_start__ + 0x20000))), error: .rodata is too large to fit in FLASH memory segment) - 0x08000fcc __ARM.exidx_load_start__ = ALIGN (__rodata_end__, 0x4) + 0x08001488 __ARM.exidx_load_start__ = ALIGN (__rodata_end__, 0x4) -.ARM.exidx 0x08000fcc 0x0 - 0x08000fcc __ARM.exidx_start__ = . - 0x08000fcc __exidx_start = __ARM.exidx_start__ +.ARM.exidx 0x08001488 0x0 + 0x08001488 __ARM.exidx_start__ = . + 0x08001488 __exidx_start = __ARM.exidx_start__ *(.ARM.exidx .ARM.exidx.*) - 0x08000fcc __ARM.exidx_end__ = (__ARM.exidx_start__ + SIZEOF (.ARM.exidx)) - 0x08000fcc __exidx_end = __ARM.exidx_end__ - 0x08000fcc __ARM.exidx_load_end__ = __ARM.exidx_end__ + 0x08001488 __ARM.exidx_end__ = (__ARM.exidx_start__ + SIZEOF (.ARM.exidx)) + 0x08001488 __exidx_end = __ARM.exidx_end__ + 0x08001488 __ARM.exidx_load_end__ = __ARM.exidx_end__ 0x00000001 . = ASSERT (((__ARM.exidx_end__ >= __FLASH_segment_start__) && (__ARM.exidx_end__ <= (__FLASH_segment_start__ + 0x20000))), error: .ARM.exidx is too large to fit in FLASH memory segment) - 0x08000fcc __fast_load_start__ = ALIGN (__ARM.exidx_end__, 0x4) + 0x08001488 __fast_load_start__ = ALIGN (__ARM.exidx_end__, 0x4) -.fast 0x20000000 0x0 load address 0x08000fcc +.fast 0x20000000 0x0 load address 0x08001488 0x20000000 __fast_start__ = . *(.fast .fast.*) 0x20000000 __fast_end__ = (__fast_start__ + SIZEOF (.fast)) - 0x08000fcc __fast_load_end__ = (__fast_load_start__ + SIZEOF (.fast)) + 0x08001488 __fast_load_end__ = (__fast_load_start__ + SIZEOF (.fast)) 0x00000001 . = ASSERT ((((__fast_load_start__ + SIZEOF (.fast)) >= __FLASH_segment_start__) && ((__fast_load_start__ + SIZEOF (.fast)) <= (__FLASH_segment_start__ + 0x20000))), error: .fast is too large to fit in FLASH memory segment) .fast_run 0x20000000 0x0 @@ -424,13 +438,13 @@ Linker script and memory map 0x20000000 __fast_run_end__ = (__fast_run_start__ + SIZEOF (.fast_run)) 0x20000000 __fast_run_load_end__ = __fast_run_end__ 0x00000001 . = ASSERT (((__fast_run_end__ >= __RAM_segment_start__) && (__fast_run_end__ <= (__RAM_segment_start__ + 0x5000))), error: .fast_run is too large to fit in RAM memory segment) - 0x08000fcc __data_load_start__ = ALIGN ((__fast_load_start__ + SIZEOF (.fast)), 0x4) + 0x08001488 __data_load_start__ = ALIGN ((__fast_load_start__ + SIZEOF (.fast)), 0x4) -.data 0x20000000 0x0 load address 0x08000fcc +.data 0x20000000 0x0 load address 0x08001488 0x20000000 __data_start__ = . *(.data .data.* .gnu.linkonce.d.*) 0x20000000 __data_end__ = (__data_start__ + SIZEOF (.data)) - 0x08000fcc __data_load_end__ = (__data_load_start__ + SIZEOF (.data)) + 0x08001488 __data_load_end__ = (__data_load_start__ + SIZEOF (.data)) 0x00000001 . = ASSERT ((((__data_load_start__ + SIZEOF (.data)) >= __FLASH_segment_start__) && ((__data_load_start__ + SIZEOF (.data)) <= (__FLASH_segment_start__ + 0x20000))), error: .data is too large to fit in FLASH memory segment) .data_run 0x20000000 0x0 @@ -441,99 +455,100 @@ Linker script and memory map 0x00000001 . = ASSERT (((__data_run_end__ >= __RAM_segment_start__) && (__data_run_end__ <= (__RAM_segment_start__ + 0x5000))), error: .data_run is too large to fit in RAM memory segment) 0x20000000 __bss_load_start__ = ALIGN (__data_run_end__, 0x4) -.bss 0x20000000 0x4e8 +.bss 0x20000000 0x4ec 0x20000000 __bss_start__ = . *(.bss .bss.* .gnu.linkonce.b.*) .bss.millisecond_counter 0x20000000 0x2 THUMB Debug/../../obj/timer.o + *fill* 0x20000002 0x2 00 .bss.xcpCtoReqPacket.876 - 0x20000002 0x41 THUMB Debug/../../obj/uart.o + 0x20000004 0x44 THUMB Debug/../../obj/uart.o .bss.xcpCtoRxInProgress.878 - 0x20000043 0x1 THUMB Debug/../../obj/uart.o + 0x20000048 0x1 THUMB Debug/../../obj/uart.o .bss.xcpCtoRxLength.877 - 0x20000044 0x1 THUMB Debug/../../obj/uart.o - *fill* 0x20000045 0x3 00 + 0x20000049 0x1 THUMB Debug/../../obj/uart.o + *fill* 0x2000004a 0x2 00 .bss.bootBlockInfo - 0x20000048 0x204 THUMB Debug/../../obj/flash.o + 0x2000004c 0x204 THUMB Debug/../../obj/flash.o .bss.blockInfo - 0x2000024c 0x204 THUMB Debug/../../obj/flash.o + 0x20000250 0x204 THUMB Debug/../../obj/flash.o .bss.assert_failure_file - 0x20000450 0x4 THUMB Debug/../../obj/assert.o - .bss.assert_failure_line 0x20000454 0x4 THUMB Debug/../../obj/assert.o + .bss.assert_failure_line + 0x20000458 0x4 THUMB Debug/../../obj/assert.o .bss.backdoorOpen - 0x20000458 0x1 THUMB Debug/../../obj/backdoor.o + 0x2000045c 0x1 THUMB Debug/../../obj/backdoor.o .bss.comEntryStateConnect - 0x20000459 0x1 THUMB Debug/../../obj/com.o + 0x2000045d 0x1 THUMB Debug/../../obj/com.o + *fill* 0x2000045e 0x2 00 .bss.xcpCtoReqPacket.855 - 0x2000045a 0x40 THUMB Debug/../../obj/com.o - *fill* 0x2000049a 0x2 00 - .bss.xcpInfo 0x2000049c 0x4c THUMB Debug/../../obj/xcp.o + 0x20000460 0x40 THUMB Debug/../../obj/com.o + .bss.xcpInfo 0x200004a0 0x4c THUMB Debug/../../obj/xcp.o *(COMMON) - 0x200004e8 __bss_end__ = (__bss_start__ + SIZEOF (.bss)) - 0x200004e8 __bss_load_end__ = __bss_end__ + 0x200004ec __bss_end__ = (__bss_start__ + SIZEOF (.bss)) + 0x200004ec __bss_load_end__ = __bss_end__ 0x00000001 . = ASSERT (((__bss_end__ >= __RAM_segment_start__) && (__bss_end__ <= (__RAM_segment_start__ + 0x5000))), error: .bss is too large to fit in RAM memory segment) - 0x200004e8 __non_init_load_start__ = ALIGN (__bss_end__, 0x4) + 0x200004ec __non_init_load_start__ = ALIGN (__bss_end__, 0x4) -.non_init 0x200004e8 0x0 - 0x200004e8 __non_init_start__ = . +.non_init 0x200004ec 0x0 + 0x200004ec __non_init_start__ = . *(.non_init .non_init.*) - 0x200004e8 __non_init_end__ = (__non_init_start__ + SIZEOF (.non_init)) - 0x200004e8 __non_init_load_end__ = __non_init_end__ + 0x200004ec __non_init_end__ = (__non_init_start__ + SIZEOF (.non_init)) + 0x200004ec __non_init_load_end__ = __non_init_end__ 0x00000001 . = ASSERT (((__non_init_end__ >= __RAM_segment_start__) && (__non_init_end__ <= (__RAM_segment_start__ + 0x5000))), error: .non_init is too large to fit in RAM memory segment) - 0x200004e8 __heap_load_start__ = ALIGN (__non_init_end__, 0x4) + 0x200004ec __heap_load_start__ = ALIGN (__non_init_end__, 0x4) -.heap 0x200004e8 0x80 - 0x200004e8 __heap_start__ = . +.heap 0x200004ec 0x80 + 0x200004ec __heap_start__ = . *(.heap .heap.*) - 0x20000568 . = ALIGN (MAX ((__heap_start__ + __HEAPSIZE__), .), 0x4) - *fill* 0x200004e8 0x80 00 - 0x20000568 __heap_end__ = (__heap_start__ + SIZEOF (.heap)) - 0x20000568 __heap_load_end__ = __heap_end__ + 0x2000056c . = ALIGN (MAX ((__heap_start__ + __HEAPSIZE__), .), 0x4) + *fill* 0x200004ec 0x80 00 + 0x2000056c __heap_end__ = (__heap_start__ + SIZEOF (.heap)) + 0x2000056c __heap_load_end__ = __heap_end__ 0x00000001 . = ASSERT (((__heap_end__ >= __RAM_segment_start__) && (__heap_end__ <= (__RAM_segment_start__ + 0x5000))), error: .heap is too large to fit in RAM memory segment) - 0x20000568 __stack_load_start__ = ALIGN (__heap_end__, 0x4) + 0x2000056c __stack_load_start__ = ALIGN (__heap_end__, 0x4) -.stack 0x20000568 0x100 - 0x20000568 __stack_start__ = . +.stack 0x2000056c 0x100 + 0x2000056c __stack_start__ = . *(.stack .stack.*) - 0x20000668 . = ALIGN (MAX ((__stack_start__ + __STACKSIZE__), .), 0x4) - *fill* 0x20000568 0x100 00 - 0x20000668 __stack_end__ = (__stack_start__ + SIZEOF (.stack)) - 0x20000668 __stack_load_end__ = __stack_end__ + 0x2000066c . = ALIGN (MAX ((__stack_start__ + __STACKSIZE__), .), 0x4) + *fill* 0x2000056c 0x100 00 + 0x2000066c __stack_end__ = (__stack_start__ + SIZEOF (.stack)) + 0x2000066c __stack_load_end__ = __stack_end__ 0x00000001 . = ASSERT (((__stack_end__ >= __RAM_segment_start__) && (__stack_end__ <= (__RAM_segment_start__ + 0x5000))), error: .stack is too large to fit in RAM memory segment) - 0x20000668 __stack_process_load_start__ = ALIGN (__stack_end__, 0x4) + 0x2000066c __stack_process_load_start__ = ALIGN (__stack_end__, 0x4) -.stack_process 0x20000668 0x0 - 0x20000668 __stack_process_start__ = . +.stack_process 0x2000066c 0x0 + 0x2000066c __stack_process_start__ = . *(.stack_process .stack_process.*) - 0x20000668 . = ALIGN (MAX ((__stack_process_start__ + __STACKSIZE_PROCESS__), .), 0x4) - 0x20000668 __stack_process_end__ = (__stack_process_start__ + SIZEOF (.stack_process)) - 0x20000668 __stack_process_load_end__ = __stack_process_end__ + 0x2000066c . = ALIGN (MAX ((__stack_process_start__ + __STACKSIZE_PROCESS__), .), 0x4) + 0x2000066c __stack_process_end__ = (__stack_process_start__ + SIZEOF (.stack_process)) + 0x2000066c __stack_process_load_end__ = __stack_process_end__ 0x00000001 . = ASSERT (((__stack_process_end__ >= __RAM_segment_start__) && (__stack_process_end__ <= (__RAM_segment_start__ + 0x5000))), error: .stack_process is too large to fit in RAM memory segment) - 0x20000668 __tbss_load_start__ = ALIGN (__stack_process_end__, 0x4) + 0x2000066c __tbss_load_start__ = ALIGN (__stack_process_end__, 0x4) -.tbss 0x20000668 0x0 - 0x20000668 __tbss_start__ = . +.tbss 0x2000066c 0x0 + 0x2000066c __tbss_start__ = . *(.tbss .tbss.*) - 0x20000668 __tbss_end__ = (__tbss_start__ + SIZEOF (.tbss)) - 0x20000668 __tbss_load_end__ = __tbss_end__ + 0x2000066c __tbss_end__ = (__tbss_start__ + SIZEOF (.tbss)) + 0x2000066c __tbss_load_end__ = __tbss_end__ 0x00000001 . = ASSERT (((__tbss_end__ >= __RAM_segment_start__) && (__tbss_end__ <= (__RAM_segment_start__ + 0x5000))), error: .tbss is too large to fit in RAM memory segment) - 0x08000fcc __tdata_load_start__ = ALIGN ((__data_load_start__ + SIZEOF (.data)), 0x4) + 0x08001488 __tdata_load_start__ = ALIGN ((__data_load_start__ + SIZEOF (.data)), 0x4) -.tdata 0x20000668 0x0 load address 0x08000fcc - 0x20000668 __tdata_start__ = . +.tdata 0x2000066c 0x0 load address 0x08001488 + 0x2000066c __tdata_start__ = . *(.tdata .tdata.*) - 0x20000668 __tdata_end__ = (__tdata_start__ + SIZEOF (.tdata)) - 0x08000fcc __tdata_load_end__ = (__tdata_load_start__ + SIZEOF (.tdata)) - 0x08000fcc __FLASH_segment_used_end__ = (ALIGN ((__data_load_start__ + SIZEOF (.data)), 0x4) + SIZEOF (.tdata)) + 0x2000066c __tdata_end__ = (__tdata_start__ + SIZEOF (.tdata)) + 0x08001488 __tdata_load_end__ = (__tdata_load_start__ + SIZEOF (.tdata)) + 0x08001488 __FLASH_segment_used_end__ = (ALIGN ((__data_load_start__ + SIZEOF (.data)), 0x4) + SIZEOF (.tdata)) 0x00000001 . = ASSERT ((((__tdata_load_start__ + SIZEOF (.tdata)) >= __FLASH_segment_start__) && ((__tdata_load_start__ + SIZEOF (.tdata)) <= (__FLASH_segment_start__ + 0x20000))), error: .tdata is too large to fit in FLASH memory segment) -.tdata_run 0x20000668 0x0 - 0x20000668 __tdata_run_start__ = . - 0x20000668 . = MAX ((__tdata_run_start__ + SIZEOF (.tdata)), .) - 0x20000668 __tdata_run_end__ = (__tdata_run_start__ + SIZEOF (.tdata_run)) - 0x20000668 __tdata_run_load_end__ = __tdata_run_end__ - 0x20000668 __RAM_segment_used_end__ = (ALIGN (__tbss_end__, 0x4) + SIZEOF (.tdata_run)) +.tdata_run 0x2000066c 0x0 + 0x2000066c __tdata_run_start__ = . + 0x2000066c . = MAX ((__tdata_run_start__ + SIZEOF (.tdata)), .) + 0x2000066c __tdata_run_end__ = (__tdata_run_start__ + SIZEOF (.tdata_run)) + 0x2000066c __tdata_run_load_end__ = __tdata_run_end__ + 0x2000066c __RAM_segment_used_end__ = (ALIGN (__tbss_end__, 0x4) + SIZEOF (.tdata_run)) 0x00000001 . = ASSERT (((__tdata_run_end__ >= __RAM_segment_start__) && (__tdata_run_end__ <= (__RAM_segment_start__ + 0x5000))), error: .tdata_run is too large to fit in RAM memory segment) START GROUP LOAD THUMB Debug/../../obj/hooks.o @@ -563,28 +578,28 @@ LOAD C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib END GROUP OUTPUT(D:/usr/feaser/software/OpenBLT/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/ide/../bin/openbtl_olimex_stm32p103.elf elf32-littlearm) -.debug_info 0x00000000 0x29b6 +.debug_info 0x00000000 0x27fc .debug_info 0x00000000 0x5e THUMB Debug/../../obj/hooks.o .debug_info 0x0000005e 0x32a THUMB Debug/../../obj/main.o .debug_info 0x00000388 0x53d THUMB Debug/../../obj/core_cm3.o .debug_info 0x000008c5 0x4d9 THUMB Debug/../../obj/system_stm32f10x.o .debug_info 0x00000d9e 0x114 THUMB Debug/../../obj/cstart.o - .debug_info 0x00000eb2 0xf4 THUMB Debug/../../obj/vectors.o - .debug_info 0x00000fa6 0x5e THUMB Debug/../../obj/can.o - .debug_info 0x00001004 0x13d THUMB Debug/../../obj/cpu.o - .debug_info 0x00001141 0x15e THUMB Debug/../../obj/nvm.o - .debug_info 0x0000129f 0x187 THUMB Debug/../../obj/timer.o - .debug_info 0x00001426 0x300 THUMB Debug/../../obj/uart.o - .debug_info 0x00001726 0x7b4 THUMB Debug/../../obj/flash.o - .debug_info 0x00001eda 0xe8 THUMB Debug/../../obj/assert.o - .debug_info 0x00001fc2 0xa8 THUMB Debug/../../obj/backdoor.o - .debug_info 0x0000206a 0x8c THUMB Debug/../../obj/boot.o - .debug_info 0x000020f6 0x18e THUMB Debug/../../obj/com.o - .debug_info 0x00002284 0x8a THUMB Debug/../../obj/cop.o - .debug_info 0x0000230e 0x5db THUMB Debug/../../obj/xcp.o - .debug_info 0x000028e9 0xcd C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + .debug_info 0x00000eb2 0xf5 THUMB Debug/../../obj/vectors.o + .debug_info 0x00000fa7 0x5e THUMB Debug/../../obj/can.o + .debug_info 0x00001005 0x13e THUMB Debug/../../obj/cpu.o + .debug_info 0x00001143 0x162 THUMB Debug/../../obj/nvm.o + .debug_info 0x000012a5 0x148 THUMB Debug/../../obj/timer.o + .debug_info 0x000013ed 0x28d THUMB Debug/../../obj/uart.o + .debug_info 0x0000167a 0x671 THUMB Debug/../../obj/flash.o + .debug_info 0x00001ceb 0xe8 THUMB Debug/../../obj/assert.o + .debug_info 0x00001dd3 0xa8 THUMB Debug/../../obj/backdoor.o + .debug_info 0x00001e7b 0x8c THUMB Debug/../../obj/boot.o + .debug_info 0x00001f07 0x18f THUMB Debug/../../obj/com.o + .debug_info 0x00002096 0x8a THUMB Debug/../../obj/cop.o + .debug_info 0x00002120 0x60f THUMB Debug/../../obj/xcp.o + .debug_info 0x0000272f 0xcd C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libc_user_libc_v7m_t_le.a(user_libc.o) -.debug_abbrev 0x00000000 0xf0d +.debug_abbrev 0x00000000 0xe19 .debug_abbrev 0x00000000 0x2a THUMB Debug/../../obj/hooks.o .debug_abbrev 0x0000002a 0x109 THUMB Debug/../../obj/main.o .debug_abbrev 0x00000133 0xa9 THUMB Debug/../../obj/core_cm3.o @@ -593,38 +608,38 @@ OUTPUT(D:/usr/feaser/software/OpenBLT/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_ .debug_abbrev 0x0000037c 0xc0 THUMB Debug/../../obj/vectors.o .debug_abbrev 0x0000043c 0x2a THUMB Debug/../../obj/can.o .debug_abbrev 0x00000466 0xb1 THUMB Debug/../../obj/cpu.o - .debug_abbrev 0x00000517 0xbc THUMB Debug/../../obj/nvm.o - .debug_abbrev 0x000005d3 0x13a THUMB Debug/../../obj/timer.o - .debug_abbrev 0x0000070d 0x16d THUMB Debug/../../obj/uart.o - .debug_abbrev 0x0000087a 0x279 THUMB Debug/../../obj/flash.o - .debug_abbrev 0x00000af3 0x7e THUMB Debug/../../obj/assert.o - .debug_abbrev 0x00000b71 0x5d THUMB Debug/../../obj/backdoor.o - .debug_abbrev 0x00000bce 0x41 THUMB Debug/../../obj/boot.o - .debug_abbrev 0x00000c0f 0xcb THUMB Debug/../../obj/com.o - .debug_abbrev 0x00000cda 0x41 THUMB Debug/../../obj/cop.o - .debug_abbrev 0x00000d1b 0x1cd THUMB Debug/../../obj/xcp.o - .debug_abbrev 0x00000ee8 0x25 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + .debug_abbrev 0x00000517 0xa5 THUMB Debug/../../obj/nvm.o + .debug_abbrev 0x000005bc 0xe1 THUMB Debug/../../obj/timer.o + .debug_abbrev 0x0000069d 0x133 THUMB Debug/../../obj/uart.o + .debug_abbrev 0x000007d0 0x229 THUMB Debug/../../obj/flash.o + .debug_abbrev 0x000009f9 0x7e THUMB Debug/../../obj/assert.o + .debug_abbrev 0x00000a77 0x5d THUMB Debug/../../obj/backdoor.o + .debug_abbrev 0x00000ad4 0x41 THUMB Debug/../../obj/boot.o + .debug_abbrev 0x00000b15 0xe2 THUMB Debug/../../obj/com.o + .debug_abbrev 0x00000bf7 0x41 THUMB Debug/../../obj/cop.o + .debug_abbrev 0x00000c38 0x1bc THUMB Debug/../../obj/xcp.o + .debug_abbrev 0x00000df4 0x25 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libc_user_libc_v7m_t_le.a(user_libc.o) -.debug_line 0x00000000 0x179e +.debug_line 0x00000000 0x177d .debug_line 0x00000000 0x1d THUMB Debug/../../obj/hooks.o - .debug_line 0x0000001d 0x1d6 THUMB Debug/../../obj/main.o - .debug_line 0x000001f3 0x295 THUMB Debug/../../obj/core_cm3.o - .debug_line 0x00000488 0x219 THUMB Debug/../../obj/system_stm32f10x.o - .debug_line 0x000006a1 0x15c THUMB Debug/../../obj/cstart.o - .debug_line 0x000007fd 0xf1 THUMB Debug/../../obj/vectors.o - .debug_line 0x000008ee 0x1d THUMB Debug/../../obj/can.o - .debug_line 0x0000090b 0x113 THUMB Debug/../../obj/cpu.o - .debug_line 0x00000a1e 0x133 THUMB Debug/../../obj/nvm.o - .debug_line 0x00000b51 0x140 THUMB Debug/../../obj/timer.o - .debug_line 0x00000c91 0x17d THUMB Debug/../../obj/uart.o - .debug_line 0x00000e0e 0x2aa THUMB Debug/../../obj/flash.o - .debug_line 0x000010b8 0xde THUMB Debug/../../obj/assert.o - .debug_line 0x00001196 0xfb THUMB Debug/../../obj/backdoor.o - .debug_line 0x00001291 0xbf THUMB Debug/../../obj/boot.o - .debug_line 0x00001350 0x138 THUMB Debug/../../obj/com.o - .debug_line 0x00001488 0xb7 THUMB Debug/../../obj/cop.o - .debug_line 0x0000153f 0x1eb THUMB Debug/../../obj/xcp.o - .debug_line 0x0000172a 0x74 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + .debug_line 0x0000001d 0x1d7 THUMB Debug/../../obj/main.o + .debug_line 0x000001f4 0x295 THUMB Debug/../../obj/core_cm3.o + .debug_line 0x00000489 0x217 THUMB Debug/../../obj/system_stm32f10x.o + .debug_line 0x000006a0 0x15c THUMB Debug/../../obj/cstart.o + .debug_line 0x000007fc 0xf0 THUMB Debug/../../obj/vectors.o + .debug_line 0x000008ec 0x1d THUMB Debug/../../obj/can.o + .debug_line 0x00000909 0x116 THUMB Debug/../../obj/cpu.o + .debug_line 0x00000a1f 0x133 THUMB Debug/../../obj/nvm.o + .debug_line 0x00000b52 0x131 THUMB Debug/../../obj/timer.o + .debug_line 0x00000c83 0x16b THUMB Debug/../../obj/uart.o + .debug_line 0x00000dee 0x2c8 THUMB Debug/../../obj/flash.o + .debug_line 0x000010b6 0xdc THUMB Debug/../../obj/assert.o + .debug_line 0x00001192 0xf4 THUMB Debug/../../obj/backdoor.o + .debug_line 0x00001286 0xbf THUMB Debug/../../obj/boot.o + .debug_line 0x00001345 0x136 THUMB Debug/../../obj/com.o + .debug_line 0x0000147b 0xb7 THUMB Debug/../../obj/cop.o + .debug_line 0x00001532 0x1d7 THUMB Debug/../../obj/xcp.o + .debug_line 0x00001709 0x74 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libc_user_libc_v7m_t_le.a(user_libc.o) .debug_str 0x00000000 0x13e2 .debug_str 0x00000000 0xfc THUMB Debug/../../obj/hooks.o @@ -728,41 +743,42 @@ OUTPUT(D:/usr/feaser/software/OpenBLT/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_ .ARM.attributes 0x00000130 0x10 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libc_user_libc_v7m_t_le.a(user_libc.o) -.debug_frame 0x00000000 0x810 +.debug_frame 0x00000000 0x8fc .debug_frame 0x00000000 0x30 THUMB Debug/../../obj/main.o .debug_frame 0x00000030 0x170 THUMB Debug/../../obj/core_cm3.o .debug_frame 0x000001a0 0x38 THUMB Debug/../../obj/system_stm32f10x.o - .debug_frame 0x000001d8 0x20 THUMB Debug/../../obj/vectors.o - .debug_frame 0x000001f8 0x5c THUMB Debug/../../obj/cpu.o - .debug_frame 0x00000254 0x6c THUMB Debug/../../obj/nvm.o - .debug_frame 0x000002c0 0x6c THUMB Debug/../../obj/timer.o - .debug_frame 0x0000032c 0x64 THUMB Debug/../../obj/uart.o - .debug_frame 0x00000390 0x150 THUMB Debug/../../obj/flash.o - .debug_frame 0x000004e0 0x2c THUMB Debug/../../obj/assert.o - .debug_frame 0x0000050c 0x48 THUMB Debug/../../obj/backdoor.o - .debug_frame 0x00000554 0x48 THUMB Debug/../../obj/boot.o - .debug_frame 0x0000059c 0x94 THUMB Debug/../../obj/com.o - .debug_frame 0x00000630 0x30 THUMB Debug/../../obj/cop.o - .debug_frame 0x00000660 0x70 THUMB Debug/../../obj/xcp.o - .debug_frame 0x000006d0 0xa0 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libdebugio_v7m_t_le.a(libdebugio_asm.o) - .debug_frame 0x00000770 0xa0 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + .debug_frame 0x000001d8 0x2c THUMB Debug/../../obj/vectors.o + .debug_frame 0x00000204 0x68 THUMB Debug/../../obj/cpu.o + .debug_frame 0x0000026c 0x9c THUMB Debug/../../obj/nvm.o + .debug_frame 0x00000308 0x78 THUMB Debug/../../obj/timer.o + .debug_frame 0x00000380 0x90 THUMB Debug/../../obj/uart.o + .debug_frame 0x00000410 0x19c THUMB Debug/../../obj/flash.o + .debug_frame 0x000005ac 0x2c THUMB Debug/../../obj/assert.o + .debug_frame 0x000005d8 0x48 THUMB Debug/../../obj/backdoor.o + .debug_frame 0x00000620 0x48 THUMB Debug/../../obj/boot.o + .debug_frame 0x00000668 0xa4 THUMB Debug/../../obj/com.o + .debug_frame 0x0000070c 0x30 THUMB Debug/../../obj/cop.o + .debug_frame 0x0000073c 0x80 THUMB Debug/../../obj/xcp.o + .debug_frame 0x000007bc 0xa0 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libdebugio_v7m_t_le.a(libdebugio_asm.o) + .debug_frame 0x0000085c 0xa0 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libc_user_libc_v7m_t_le.a(user_libc.o) -.debug_loc 0x00000000 0x100c - .debug_loc 0x00000000 0x76 THUMB Debug/../../obj/main.o - .debug_loc 0x00000076 0x2ae THUMB Debug/../../obj/core_cm3.o - .debug_loc 0x00000324 0x10e THUMB Debug/../../obj/system_stm32f10x.o - .debug_loc 0x00000432 0xc1 THUMB Debug/../../obj/cpu.o - .debug_loc 0x000004f3 0x7f THUMB Debug/../../obj/nvm.o - .debug_loc 0x00000572 0x20 THUMB Debug/../../obj/timer.o - .debug_loc 0x00000592 0x105 THUMB Debug/../../obj/uart.o - .debug_loc 0x00000697 0x6b4 THUMB Debug/../../obj/flash.o - .debug_loc 0x00000d4b 0x46 THUMB Debug/../../obj/assert.o - .debug_loc 0x00000d91 0x40 THUMB Debug/../../obj/backdoor.o - .debug_loc 0x00000dd1 0x40 THUMB Debug/../../obj/boot.o - .debug_loc 0x00000e11 0x86 THUMB Debug/../../obj/com.o - .debug_loc 0x00000e97 0x175 THUMB Debug/../../obj/xcp.o +.debug_loc 0x00000000 0x11fe + .debug_loc 0x00000000 0x82 THUMB Debug/../../obj/main.o + .debug_loc 0x00000082 0x2ae THUMB Debug/../../obj/core_cm3.o + .debug_loc 0x00000330 0x165 THUMB Debug/../../obj/system_stm32f10x.o + .debug_loc 0x00000495 0x20 THUMB Debug/../../obj/vectors.o + .debug_loc 0x000004b5 0x111 THUMB Debug/../../obj/cpu.o + .debug_loc 0x000005c6 0xff THUMB Debug/../../obj/nvm.o + .debug_loc 0x000006c5 0x40 THUMB Debug/../../obj/timer.o + .debug_loc 0x00000705 0x115 THUMB Debug/../../obj/uart.o + .debug_loc 0x0000081a 0x6c5 THUMB Debug/../../obj/flash.o + .debug_loc 0x00000edf 0x46 THUMB Debug/../../obj/assert.o + .debug_loc 0x00000f25 0x40 THUMB Debug/../../obj/backdoor.o + .debug_loc 0x00000f65 0x40 THUMB Debug/../../obj/boot.o + .debug_loc 0x00000fa5 0xb2 THUMB Debug/../../obj/com.o + .debug_loc 0x00001057 0x1a7 THUMB Debug/../../obj/xcp.o -.debug_aranges 0x00000000 0x420 +.debug_aranges 0x00000000 0x450 .debug_aranges 0x00000000 0x20 THUMB Debug/../../obj/main.o .debug_aranges @@ -780,38 +796,38 @@ OUTPUT(D:/usr/feaser/software/OpenBLT/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_ .debug_aranges 0x000001c0 0x40 THUMB Debug/../../obj/timer.o .debug_aranges - 0x00000200 0x30 THUMB Debug/../../obj/uart.o + 0x00000200 0x40 THUMB Debug/../../obj/uart.o .debug_aranges - 0x00000230 0x70 THUMB Debug/../../obj/flash.o + 0x00000240 0x88 THUMB Debug/../../obj/flash.o .debug_aranges - 0x000002a0 0x20 THUMB Debug/../../obj/assert.o + 0x000002c8 0x20 THUMB Debug/../../obj/assert.o .debug_aranges - 0x000002c0 0x28 THUMB Debug/../../obj/backdoor.o + 0x000002e8 0x28 THUMB Debug/../../obj/backdoor.o .debug_aranges - 0x000002e8 0x28 THUMB Debug/../../obj/boot.o + 0x00000310 0x28 THUMB Debug/../../obj/boot.o .debug_aranges - 0x00000310 0x48 THUMB Debug/../../obj/com.o + 0x00000338 0x48 THUMB Debug/../../obj/com.o .debug_aranges - 0x00000358 0x28 THUMB Debug/../../obj/cop.o + 0x00000380 0x28 THUMB Debug/../../obj/cop.o .debug_aranges - 0x00000380 0x40 THUMB Debug/../../obj/xcp.o + 0x000003a8 0x48 THUMB Debug/../../obj/xcp.o .debug_aranges - 0x000003c0 0x60 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + 0x000003f0 0x60 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libc_user_libc_v7m_t_le.a(user_libc.o) -.debug_ranges 0x00000000 0x420 +.debug_ranges 0x00000000 0x360 .debug_ranges 0x00000000 0x10 THUMB Debug/../../obj/main.o .debug_ranges 0x00000010 0xb8 THUMB Debug/../../obj/core_cm3.o .debug_ranges 0x000000c8 0x18 THUMB Debug/../../obj/system_stm32f10x.o .debug_ranges 0x000000e0 0x10 THUMB Debug/../../obj/vectors.o .debug_ranges 0x000000f0 0x20 THUMB Debug/../../obj/cpu.o .debug_ranges 0x00000110 0x30 THUMB Debug/../../obj/nvm.o - .debug_ranges 0x00000140 0x48 THUMB Debug/../../obj/timer.o - .debug_ranges 0x00000188 0xb0 THUMB Debug/../../obj/uart.o - .debug_ranges 0x00000238 0x78 THUMB Debug/../../obj/flash.o - .debug_ranges 0x000002b0 0x10 THUMB Debug/../../obj/assert.o - .debug_ranges 0x000002c0 0x18 THUMB Debug/../../obj/backdoor.o - .debug_ranges 0x000002d8 0x18 THUMB Debug/../../obj/boot.o - .debug_ranges 0x000002f0 0x38 THUMB Debug/../../obj/com.o - .debug_ranges 0x00000328 0x18 THUMB Debug/../../obj/cop.o - .debug_ranges 0x00000340 0x90 THUMB Debug/../../obj/xcp.o - .debug_ranges 0x000003d0 0x50 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + .debug_ranges 0x00000140 0x30 THUMB Debug/../../obj/timer.o + .debug_ranges 0x00000170 0x30 THUMB Debug/../../obj/uart.o + .debug_ranges 0x000001a0 0xa8 THUMB Debug/../../obj/flash.o + .debug_ranges 0x00000248 0x10 THUMB Debug/../../obj/assert.o + .debug_ranges 0x00000258 0x18 THUMB Debug/../../obj/backdoor.o + .debug_ranges 0x00000270 0x18 THUMB Debug/../../obj/boot.o + .debug_ranges 0x00000288 0x38 THUMB Debug/../../obj/com.o + .debug_ranges 0x000002c0 0x18 THUMB Debug/../../obj/cop.o + .debug_ranges 0x000002d8 0x38 THUMB Debug/../../obj/xcp.o + .debug_ranges 0x00000310 0x50 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.1/lib/libc_user_libc_v7m_t_le.a(user_libc.o) diff --git a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/bin/openbtl_olimex_stm32p103.srec b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/bin/openbtl_olimex_stm32p103.srec index d027013b..ebaebde5 100644 --- a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/bin/openbtl_olimex_stm32p103.srec +++ b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/bin/openbtl_olimex_stm32p103.srec @@ -1,25 +1,25 @@ S02B0000443A2F7573722F6665617365722F736F6674776172652F4F70656E424C542F5461726765742F44657D -S3150800000068060020DB01000815040008150400082E -S31508000010150400081504000815040008150400084E -S31508000020150400081504000815040008150400083E -S31508000030150400081504000815040008150400082E -S31508000040150400081504000815040008150400081E -S31508000050150400081504000815040008150400080E -S3150800006015040008150400081504000815040008FE -S3150800007015040008150400081504000815040008EE -S3150800008015040008150400081504000815040008DE -S3150800009015040008150400081504000815040008CE -S315080000A015040008150400081504000815040008BE -S315080000B015040008150400081504000815040008AE -S315080000C0150400081504000815040008150400089E -S315080000D0150400081504000815040008150400088E -S315080000E0150400081504000815040008150400087E -S315080000F0150400081504000815040008150400086E -S31508000100150400081504000815040008150400085D -S31508000110150400081504000815040008150400084D -S31508000120150400081504000815040008150400083D -S31508000130150400081504000815040008150400082D -S31508000140150400081504000815040008150400081D +S315080000006C060020DB0100085904000859040008A2 +S31508000010590400085904000859040008590400083E +S31508000020590400085904000859040008590400082E +S31508000030590400085904000859040008590400081E +S31508000040590400085904000859040008590400080E +S3150800005059040008590400085904000859040008FE +S3150800006059040008590400085904000859040008EE +S3150800007059040008590400085904000859040008DE +S3150800008059040008590400085904000859040008CE +S3150800009059040008590400085904000859040008BE +S315080000A059040008590400085904000859040008AE +S315080000B0590400085904000859040008590400089E +S315080000C0590400085904000859040008590400088E +S315080000D0590400085904000859040008590400087E +S315080000E0590400085904000859040008590400086E +S315080000F0590400085904000859040008590400085E +S31508000100590400085904000859040008590400084D +S31508000110590400085904000859040008590400083D +S31508000120590400085904000859040008590400082D +S31508000130590400085904000859040008590400081D +S31508000140590400085904000859040008590400080D S3150800015072B64B484B4901604B498D464B484C4952 S315080001604C4A00F07BF84C484C494D4A00F076F86A S315080001704C484D494D4A00F071F84D484D494E4A94 @@ -28,7 +28,7 @@ S315080001904E494F4A00F062F84E484F49002200F097 S315080001A068F84E484E49091A082903DB00220260FE S315080001B0043001603F484049884205D0026804304F S315080001C003B4904703BCF7E700208646EC4600F0E8 -S315080001D0A1FC00200021434A904772B62A498D4661 +S315080001D0FDFD00200021434A904772B62A498D4604 S315080001E02A482B492B4A00F039F82B482B492C4A28 S315080001F000F034F82B482C492C4A00F02FF82C48EC S315080002002C492D4A00F02AF82C482D492D4A00F091 @@ -39,218 +39,294 @@ S315080002400268043003B4904703BCF7E700208646EB S31508000250EC4600200021234A9047FEE7884207D053 S31508000260521A05D0037801300B700131013AF9D1E1 S315080002707047884202D002700130FAE770470000E2 -S3150800028008ED00E00000000868060020CC0F000812 +S3150800028008ED00E0000000086C060020881400084D S315080002900000002000000020E8020008E80200082C -S315080002A0900D0008CC0F0008000000200000002078 -S315080002B0900D0008900D0008900D0008900D00089C -S315080002C0900D0008900D0008900D0008900D00088C -S315080002D0CC0F000800000020E8040020E8040020F5 -S30D080002E068050020E902000888 -S315080002E803B5002300930193444B1A6842F00102B0 -S315080002F81A605968424A0A405A601A6822F0847293 -S3150800030822F480321A601A6822F480221A605A681F -S3150800031822F4FE025A604FF41F029A601A6842F4E1 -S3150800032880321A6040F2DC52196801F400310191F2 -S31508000338009901310091019911B900999142F3D1B7 -S315080003482E4B1B68980303D42E486F2100F06CFBCC -S315080003582D4B1A6842F010021A601A6822F0030236 -S315080003681A601A6842F002021A60A3F580535A689E -S315080003785A605A6842F400525A605A6842F48062CF -S315080003885A605A6822F47C125A605A6842F4E8128B -S315080003985A601A6842F080721A601968174A890101 -S315080003A8FBD5536823F003035360536843F00203ED -S315080003B853605168114B01F00C010829F9D1DA6923 -S315080003C842F40032DA619A6942F005029A61A3F5A5 -S315080003D884331A6822F470621A601A6842F4306222 -S315080003E81A601A6822F470421A601A6842F480423F -S315080003F81A6000F049FB00F052FBFCE700100240C7 -S315080004080000FFF8900D00080020024001483C2132 -S3150800041800F00ABBF70D000800B500F027F830B160 -S31508000428044B4FF400521A60034B1B6898475DF853 -S3150800043804FB00BF08ED00E00420000870B50C4670 -S3150800044895B2064607E014F8013B013D06F8013B5C -S3150800045800F065FBADB2002DF5D170BDFFF7B9BE4A -S3150800046800F0ACB900F0B6B900F0DAB900F076BA1F -S3150800047800B500F09DFA18B15DF804EB00F0BABAB9 -S315080004885DF804FB054B064900221A6059600521E8 -S315080004989A601960034B1A80704700BF10E000E0A5 -S315080004A83F19010000000020014B00221A6070471E -S315080004B810E000E0044B1B68DB0303D5034B1A88DE -S315080004C801321A80704700BF10E000E000000020E3 -S315080004D800B5FFF7EFFF024B18885DF804FB00BF6D -S315080004E800000020084B00221A819A811A829A82F3 -S315080004F81A8340F271221A819A8992B242F40052FA -S3150800050842F00C029A817047004400402DE9F041F8 -S31508000518CEB2402E804603D91948882100F084FABD -S31508000528184C2388180648BFA68002D405E000F0B0 -S31508000538F6FA23881906FAD503E011488B2100F044 -S3150800054873FA104D00242F4614E000F0E8FA2A88BA -S3150800055818F80430120648BFAB8002D405E000F04C -S31508000568DEFA3B881B06FAD503E00548932100F016 -S315080005785BFA0134A3B2B342E7D3BDE8F08100BF02 -S31508000588890E00080044004070B5164C164B2278B0 -S3150800059862B9188810F0200022D09988134B1046A3 -S315080005A8197001232370124B1A7070BD1988104AE6 -S315080005B811F02001157810D00C499E884B195E70E9 -S315080005C86B1CDBB213700A789A4208D10131FFF71F -S315080005D835FF00232370012070BD084670BD002032 -S315080005E870BD00BF43000020004400400200002000 -S315080005F844000020024B1A6942F080021A617047CB -S315080006080020024070B50C4D0646002400F087FA13 -S315080006182B689E4209D36A689B189E4205D2064BE8 -S315080006280C2202FB0434207A70BD01340C350F2CD9 -S31508000638ECD1FF2070BD00BF100F00082DE9F0436C -S3150800064804460068FFF7DEFFFF283ED0214F224BFD -S315080006587B6003F188337B603423FB60FD6815F003 -S31508000668010502D0FFF7C6FF2FE03B69B94643F0FC -S3150800067801033B612A1DA6582368B2B205EB030895 -S31508000688EA5201E000F04BFAFB68DB07FAD4330CB0 -S31508000698A8F8023001E000F042FAD9F80C3013F055 -S315080006A80103F8D1D8F80020B24205D10435B5F5CA -S315080006B8007FDFD1012400E01C46064B1A6922F0A8 -S315080006C801021A61FFF796FF00E000242046BDE8FC -S315080006D8F08300BF0020024023016745114B30B55F -S315080006E8984204460D4606D00F4A914205D0FFF7B0 -S315080006F8A5FF18B910E00D4C00E01C46EB050DD116 -S315080007082368AB420BD0204640F8045B29464FF4D1 -S315080007180072FFF793FE02E0044600E00024204634 -S3150800072830BD00BF48000020002000084C02002009 -S315080007382DE9F0431FFA83F8036821F4FE7701339D -S3150800074804460D46164627F0030706D140F8047BEB -S3150800075839464FF40072FFF771FE2368BB4205D08D -S3150800076820463946FFF7BAFF044610B3236840F215 -S31508000778FF19ED1A0435651907F5007700F0CFF962 -S31508000788231DEB1A4B4506D920463946FFF7A6FF1F -S31508000798044680B1051D16F8013B08F1FF381FFA13 -S315080007A888F805F8013BB8F1000FE7D10120BDE844 -S315080007B8F083BDE8F083BDE8F0830000034A4FF0F4 -S315080007C8FF331360024A1360704700BF4C020020CB -S315080007D84800002070B504460E461546FFF712FF76 -S315080007E8FF2815D0601E8019FFF70CFFFF280FD0C9 -S315080007F824F4FE73074A23F0030393420CBF064802 -S315080008080648B3B221462A46BDE87040FFF790BFAE -S31508000818002070BD00200008480000204C02002077 -S315080008282DE9F0410E460446FFF7ECFE013C054665 -S31508000838A019FFF7E7FEA5F1FF014C4244EB0104B6 -S31508000848FF2808BF44F001040646002C7DD18542DE -S3150800085878D8002D73D00F2874D83D4B3D4A5A6076 -S3150800086802F188325A603422DA60DA6812F0010234 -S3150800087802D0FFF7BFFE65E01969374F41F002015C -S315080008881961B846144600F04AF998F80830AB4298 -S3150800089804D10C235C43304B1C5906E001340F2C59 -S315080008A808F10C08EFD14FF0FF34DFF8AC800025CB -S315080008B800F035F998F80830B34205D10C235D43A2 -S315080008C8254B53F8058006E001350F2D08F10C086D -S315080008D8EED14FF0FF38002500F021F93B7AB342F4 -S315080008E805D11D4B0C2202FB05356B6804E0013562 -S315080008F80C370F2DF0D10023C4EB08089844C8F329 -S315080009088F280026124D0EE06C612B6943F04003D0 -S315080009182B6101E000F003F9EB68DA07FAD401362F -S31508000928B6B204F580644645094BEDD31A6922F038 -S3150800093802021A61FFF75EFE0120BDE8F08128462B -S31508000948BDE8F0812046BDE8F0810020BDE8F081C9 -S315080009580020024023016745100F00080D4B186850 -S31508000968043B1B68C0180C4B1B68C0180B4B1B684C -S31508000978C0180B4B1B68C0180A4B1B68C0180A4BD3 -S315080009881B68C018094B1B68C018D0F1010038BF8E -S315080009980020704704200008082000080C200008DA -S315080009A81020000814200008182000085021000804 -S315080009B80E4B11B55A689C68A418DA68A4181A69FF -S315080009C8A4185A69A4189A69DB69A418E418644231 -S315080009D80094FFF7C3FF844205D004216A460448F9 -S315080009E8FFF7F8FE00E0012018BD00BF4800002008 -S315080009F8502100080A4800B50368013302D0FFF7FA -S31508000A081DFE58B107480368013306D0FFF716FEDE -S31508000A18003018BF01205DF804FB01205DF804FBCF -S31508000A28480000204C020020034B00B51860034B11 -S31508000A38196000F074F8FCE75004002054040020FC -S31508000A4810B500F069F801280FD0084C2378012B57 -S31508000A580BD1FFF73DFD312807D900232370FFF78F -S31508000A6823FDBDE81040FFF7D7BC10BD5804002089 -S31508000A78044B012200B51A70FFF704FD5DF804EB74 -S31508000A88FFF7DEBF5804002000B500F047F8FFF767 -S31508000A98EFFFFFF7E5FC5DF804EB00F009B800B5D1 -S31508000AA800F03DF800F01AF85DF804EBFFF7C8BF48 -S31508000AB801B5FF238DF8003000238DF8013000F0CA -S31508000AC839F8FFF70FFD044B1B78012B02D168464E -S31508000AD800F04EF808BD00BF5904002000B50648C6 -S31508000AE8FFF752FD012804D103485DF804EB00F02E -S31508000AF83FB85DF804FB00BF5A04002000B5C9B228 -S31508000B08FFF704FD5DF804EB00F02AB8014B012253 -S31508000B181A7070475904002000F01AB870477047D1 -S31508000B28034BFE22DA7002221871A3F84420704794 -S31508000B389C040020054B00221A709A6483F8432007 -S31508000B48A3F844209A705A70704700BF9C04002086 -S31508000B58024B1878003018BF012070479C04002003 -S31508000B68024B002283F84320704700BF9C040020EC -S31508000B7870B503780546FF2B784C0FD1E370102320 -S31508000B88012200212371402322706272A2726170C9 -S31508000B986171A371E371217208227DE02678012E1E -S31508000BA840F0DB80F32B40D011D8CF2B00F0B7806C -S31508000BB805D8C92B77D0CC2B40F0BA80B6E0D12B14 -S31508000BC800F0A7807CD3D22B40F0B28093E0FA2BB2 -S31508000BD847D006D8F52B0CD011D3F62B40F0A880B1 -S31508000BE81FE0FD2B4ED0FE2B59D0FC2B40F0A080E1 -S31508000BF846E042783F2A66D8201DA16C06E043786D -S31508000C083F2B60D84168A1644278201DFFF716FC7F -S31508000C18FF23E3706A78A36CD318A3646B7801334F -S31508000C2874E0FF23E370436848E0FF23E37000237A -S31508000C38A06C69681A4603E01C5C01331219D2B223 -S31508000C488B42F9D1454B0021DA71120E9A720122AC -S31508000C581A7108221972597259719971A3F84420A0 -S31508000C6869E0FF23E3703E4B0722A3640023237140 -S31508000C786371A37123726372A372E271082345E054 -S31508000C88002056E0FF236278E3700023627123711F -S31508000C98A371E37123720622A4F844204BE00023CB -S31508000CA8237063703DE0421C3F21A06CFFF7DAFB16 -S31508000CB800283BD0FF23E370A36C3F33A36432E0DC -S31508000CC843783E2B01D9222033E0FF23E370A4F8AA -S31508000CD84460417821B9FFF7CBFB00282BD125E0E2 -S31508000CE81E4C821CA06CFFF7BDFBF8B16A78A36C92 -S31508000CF8D318A3641FE0FF23E3704022002323715F -S31508000D086371E37123726372A2710723A4F84430EE -S31508000D1811E0A06C6968FFF7A7FB10B906E0FFF7B2 -S31508000D289DFBFF23E370A4F8446004E0312000E04B -S31508000D382020FFF7F5FE094C94F84330012B02D121 -S31508000D481020FFF7EDFEB4F844100648012384F88E -S31508000D584330BDE87040FFF7D1BE70BD9C04002043 -S31508000D68C40F00089F04002000B503B400F008F873 -S31508000D7803BC02B4694609BE00F004F801BC00BD0C -S30D08000D88704700BF704700BF69 -S31508000D90443A2F7573722F6665617365722F736F88 -S31508000DA06674776172652F4F70656E424C542F5486 -S31508000DB061726765742F44656D6F2F41524D434DBF -S31508000DC0335F53544D33325F4F6C696D65785F53AB -S31508000DD0544D3332503130335F43726F7373776FCC -S31508000DE0726B732F426F6F742F6964652F2E2E2FC7 -S31508000DF06D61696E2E6300443A2F7573722F6665AE -S31508000E00617365722F736F6674776172652F4F70A1 -S31508000E10656E424C542F5461726765742F44656D34 -S31508000E206F2F41524D434D335F53544D33325F4F0D -S31508000E306C696D65785F53544D3332503130335F8A -S31508000E4043726F7373776F726B732F426F6F742F62 -S31508000E506964652F2E2E2F2E2E2F2E2E2F2E2E2FF7 -S31508000E60536F757263652F41524D434D335F53542B -S31508000E704D33322F43726F7373776F726B732F769E -S31508000E806563746F72732E6300443A2F7573722FFD -S31508000E906665617365722F736F6674776172652F05 -S31508000EA04F70656E424C542F5461726765742F44B7 -S31508000EB0656D6F2F41524D434D335F53544D333259 -S31508000EC05F4F6C696D65785F53544D3332503130DE -S31508000ED0335F43726F7373776F726B732F426F6FE3 -S31508000EE0742F6964652F2E2E2F2E2E2F2E2E2F2E21 -S31508000EF02E2F536F757263652F41524D434D335FE5 -S31508000F0053544D33322F756172742E6300000000FE -S31508000F100020000800200000010000000040000832 -S31508000F200020000002000000006000080020000009 -S31508000F3003000000008000080020000004000000F4 -S31508000F4000A00008002000000500000000C00008FE -S31508000F50002000000600000000E000080020000055 -S31508000F60070000000000010800200000080000003B -S31508000F7000200108002000000900000000400108C8 -S31508000F80002000000A0000000060010800200000A0 -S31508000F900B00000000800108002000000C00000083 -S31508000FA000A00108002000000D00000000C0010894 -S31508000FB0002000000E00000000E0010800200000EC -S31108000FC00F0000004F70656E424C540094 +S315080002A04C120008881400080000002000000020F6 +S315080002B04C1200084C1200084C1200084C12000898 +S315080002C04C1200084C1200084C1200084C12000888 +S315080002D08814000800000020EC040020EC0400202C +S30D080002E06C050020E902000884 +S315080002E800B582B04FF00003009301934FF4805392 +S315080002F8C4F202031A6842F001021A6059684FF0FC +S315080003080002CFF6FF020A405A601A6822F0847281 +S3150800031822F480321A601A6822F480221A605A680F +S3150800032822F4FE025A604FF41F029A601A6842F4D1 +S3150800033880321A604FF48053C4F2020340F2DC524A +S31508000348196801F400310191009901F10101009140 +S31508000358019911B900999142F2D14FF48053C4F228 +S3150800036802031B6813F4003F04D138484FF06F01A5 +S3150800037800F0A4FC4FF40053C4F202031A6842F0D2 +S3150800038810021A601A6822F003021A601A6842F004 +S3150800039802021A604FF48053C4F202035A685A607C +S315080003A85A6842F400525A605A6842F480625A609F +S315080003B85A6822F47C125A605A6842F4E8125A605B +S315080003C81A6842F080721A604FF48053C4F2020326 +S315080003D81A6812F0007FFBD04FF48053C4F2020368 +S315080003E85A6822F003025A605A6842F002025A60B2 +S315080003F84FF48053C4F202035A6802F00C02082A22 +S31508000408FAD14FF48053C4F20203DA6942F400328F +S31508000418DA619A6942F005029A614FF40063C4F2F8 +S3150800042801031A6822F470621A601A6842F4306284 +S315080004381A601A6822F470421A601A6842F48042EE +S315080004481A6000F075FC00F07FFCFCE74C12000807 +S3150800045800B541F2B420C0F600004FF03C0100F0A8 +S315080004682DFC5DF804FB00BF00B500F03DF860B14F +S315080004784EF60853CEF200034FF400521A6042F2C1 +S315080004880403C0F600031B6898475DF804FB00BF21 +S3150800049870B50E4692B272B1044600F1010002F137 +S315080004A8FF3292B2851816F8013B04F8013B00F0B2 +S315080004B899FCAC42F7D170BD00B5FFF78AFE5DF826 +S315080004C804FB00BF00B500F095FA5DF804FB00BF11 +S315080004D800B500F09DFA5DF804FB00BF00B500F012 +S315080004E8C3FA5DF804FB00BF00B500F05FFB5DF8D2 +S315080004F804FB00BF00B500F08DFB18B100F0B2FB95 +S315080005085DF804FB4FF000005DF804FB4EF210039B +S31508000518CEF200034FF000021A6070474EF210033D +S31508000528CEF200031B6813F4803F1FBF40F2000396 +S31508000538C2F200031A88013218BF1A80704700BF32 +S3150800054840F20003C2F200031880704700B5FFF7AF +S31508000558DDFF4EF21003CEF2000341F63F12C0F259 +S3150800056801025A604FF0000098604FF005021A60C1 +S31508000578FFF7E6FF5DF804FB00B5FFF7CFFF40F28B +S315080005880003C2F2000318885DF804FB4FF4884399 +S31508000598C4F200031B8813F0200F1FBF4FF48843CB +S315080005A8C4F200039B88037014BF0120002070471B +S315080005B810B5C0B24FF48843C4F200031B8813F081 +S315080005C8800F15D04FF48843C4F2000398801B881F +S315080005D813F0800F0FD14FF48844C4F2000400F0DA +S315080005E801FC238813F0800FF9D04FF0010010BDE5 +S315080005F84FF0000010BD4FF0010010BD4FF48843BE +S31508000608C4F200034FF000021A819A811A829A826C +S315080006181A8340F271221A819A8992B242F40052D8 +S3150800062842F00C029A8170472DE9F0410546CCB292 +S31508000638402C07D941F24830C0F600004FF088012F +S3150800064800F03CFB2046FFF7B3FF012807D041F22C +S315080006584830C0F600004FF08B0100F02FFB264605 +S31508000668BCB14FF0000441F24837C0F600074FF016 +S31508000678930800F0B7FB285DFFF79AFF012803D017 +S315080006883846414600F01AFB04F10104A3B2B34206 +S31508000698EFD3BDE8F08100BF30B5054640F2480300 +S315080006A8C2F200031B78B3B940F20400C2F2000094 +S315080006B8FFF76CFF01283BD140F24803C2F200035A +S315080006C84FF001021A7040F24903C2F200034FF0D4 +S315080006D80000187030BD40F24903C2F200031C78C6 +S315080006E840F20403C2F2000304F101001818FFF7E8 +S315080006F84DFF01281FD104F10104E2B240F2490373 +S31508000708C2F200031A7040F20403C2F200031B780F +S31508000718934213D128460B49FFF7BAFE40F248031D +S31508000728C2F200034FF000021A704FF0010030BD04 +S315080007384FF0000030BD4FF0000030BD4FF000000C +S3150800074830BD00BF050000204FF40053C4F2020371 +S3150800075840F22312C4F267525A6048F6AB12CCF636 +S31508000768EF525A604FF03402DA6070474FF400537C +S31508000778C4F202031A6942F080021A61704700BF80 +S3150800078870B5064641F2CC35C0F600054FF00004B0 +S3150800079800F028FB2B68B3420DD869685B189E429F +S315080007A809D241F2CC33C0F6000304EB440203EB4A +S315080007B88203187A70BD04F1010405F10C050F2CA3 +S315080007C8E6D14FF0FF0070BD2DE9F04107460068F5 +S315080007D8FFF7D6FFFF2808BF002454D0FFF7B4FF59 +S315080007E84FF40053C4F20203DB6813F0010F04D078 +S315080007F8FFF7BCFF4FF0000445E04FF40053C4F27E +S3150800080802031A6942F001021A614FF000054FF413 +S315080008180054C4F202043B6805EB030805F1040218 +S31508000828BE58B2B2EA52E36813F0010F05D000F0D9 +S31508000838D9FAE36813F0010FF9D14FEA1643A8F875 +S315080008480230E36813F0010F05D000F0CBFAE3682D +S3150800085813F0010FF9D1D8F80030B34207D105F1E2 +S315080008680405B5F5007FD6D14FF0010401E04FF035 +S3150800087800044FF40053C4F202031A6922F0010275 +S315080008881A61FFF773FF2046BDE8F08170B5C6B256 +S3150800089841F2CC35C0F600054FF0000400F0A2FA84 +S315080008A82B7AB34208D141F2CC33C0F6000304EBE5 +S315080008B8440253F8220070BD04F1010405F10C0541 +S315080008C80F2CEBD14FF0FF3070BD00BF00B54FEAD3 +S315080008D8C1534FEAD35363B903688B420DD040F826 +S315080008E8041B4FF40072FFF7D3FD4FF001005DF8C3 +S315080008F804FB4FF000005DF804FB4FF001005DF8BB +S3150800090804FB00BF30B504460D4640F24C03C2F25C +S315080009180003984209D04FF40053C0F600039942E1 +S3150800092808D0FFF751FF48B910E040F25024C2F248 +S31508000938000403E040F24C04C2F2000420462946AB +S31508000948FFF7C4FF002808BF002401E04FF00004A1 +S31508000958204630BD2DE9F04305460C4616469FB29B +S315080009684FEA51294FEA49290368B3F1FF3F04D1F1 +S315080009784946FFF7ABFF002830D02B684B4505D012 +S3150800098828464946FFF7BEFF054658B32B68E41ABA +S3150800099804F104042C1906F1010807F1FF37BFB260 +S315080009A8B84440F2FF1709F5007900F01BFA05F17B +S315080009B80403E31ABB4207D928464946FFF7A2FFAC +S315080009C8054698B100F1040416F8013B04F8013B02 +S315080009D84645EAD14FF00100BDE8F0834FF0000024 +S315080009E8BDE8F0834FF00000BDE8F0834FF0000043 +S315080009F8BDE8F08340F25023C2F200034FF0FF32FD +S31508000A081A6040F24C03C2F200031A60704700BF2E +S31508000A1870B504460D461646FFF7B2FEFF281DD0E8 +S31508000A2804F1FF304019FFF7ABFEFF2819D04FEA4B +S31508000A3854224FF40053C0F60003B3EB422F07BF06 +S31508000A4840F24C00C2F2000040F25020C2F2000008 +S31508000A58ABB221463246FFF77DFF70BD4FF0000066 +S31508000A6870BD4FF0000070BD2DE9F04104460E46F2 +S31508000A78FFF786FE054604F1FF34A019FFF780FE46 +S31508000A8804460646FF2814BF00230123FF2D08BF86 +S31508000A9843F00103002B40F08480854275D8002D69 +S31508000AA877D00F2879D8FFF74FFE4FF40053C4F2D2 +S31508000AB80203DB6813F0010F05D0FFF757FE4FF066 +S31508000AC80000BDE8F0814FF40053C4F202031A6926 +S31508000AD842F002021A612846FFF7D8FE0746204662 +S31508000AE8FFF7D4FE804641F2CC35C0F600054FF034 +S31508000AF8000400F077F92B7AB34209D141F2CC33D6 +S31508000B08C0F6000304EB440203EB82035B6807E0C4 +S31508000B1804F1010405F10C050F2CEAD14FF0000386 +S31508000B28C7EB08084344C3F38F2303B303F1FF3322 +S31508000B389EB206F101064FEA86264FF000054FF4E5 +S31508000B480054C4F20204EB196361236943F04003B5 +S31508000B582361E36813F0010F05D000F043F9E36851 +S31508000B6813F0010FF9D105F58065B542EBD14FF4BD +S31508000B780053C4F202031A6922F002021A61FFF747 +S31508000B88F5FD4FF00100BDE8F0814FF00000BDE823 +S31508000B98F0814FF00000BDE8F0814FF00000BDE895 +S31508000BA8F0814FF00000BDE8F08100BF42F2040270 +S31508000BB8C0F600024FF40053C0F6000310681B681D +S31508000BC8C01842F20803C0F600031B68C01842F2B0 +S31508000BD80C03C0F600031B68C01842F21003C0F6DF +S31508000BE800031B68C01842F21403C0F600031B680A +S31508000BF8C01842F21803C0F600031B68C01842F270 +S31508000C085013C0F600031B68C018D0F1010038BF9E +S31508000C180020704710B581B040F24C03C2F20003B9 +S31508000C289C685A68A418DA68A4181A69A4185A692C +S31508000C38A4189A69A418DB69E418C4F10004009496 +S31508000C48FFF7B4FF844208BF012008D042F25010CB +S31508000C58C0F600004FF004016A46FFF7D9FE01B056 +S31508000C6810BD00BF00B540F24C03C2F200031B6872 +S31508000C78B3F1FF3F06D040F24C00C2F20000FFF77E +S31508000C88A3FD90B140F25023C2F200031B68B3F1EA +S31508000C98FF3F0ED040F25020C2F20000FFF794FD45 +S31508000CA8003018BF01205DF804FB4FF000005DF81E +S31508000CB804FB4FF001005DF804FB00BF00B540F2E5 +S31508000CC85443C2F20003186040F25843C2F20003C4 +S31508000CD8196000F087F8FCE700B500F07BF80128F2 +S31508000CE815D040F25C43C2F200031B78012B0ED1E3 +S31508000CF8FFF742FC31280AD940F25C43C2F20003E6 +S31508000D084FF000021A70FFF701FCFFF7ADFB5DF81C +S31508000D1804FB00BF00B540F25C43C2F200034FF083 +S31508000D2801021A70FFF712FCFFF7D6FF5DF804FBFD +S31508000D3800B500F055F8FFF7EDFFFFF7C3FB00F025 +S31508000D480DF85DF804FB00BF00B500F04BF800F09D +S31508000D581FF8FFF7C1FF5DF804FB00BF00B581B0B7 +S31508000D684FF0FF038DF800304FF000038DF801307F +S31508000D7800F050F8FFF742FC40F25D43C2F2000368 +S31508000D881B78012B02D1684600F068F801B000BD4F +S31508000D9800B540F26040C2F20000FFF77DFC01286A +S31508000DA805D140F26040C2F2000000F057F85DF83D +S31508000DB804FB00BF00B5C9B2FFF736FC00F044F8DB +S31508000DC85DF804FB40F25D43C2F200034FF00102EE +S31508000DD81A70704700B500F02DF85DF804FB00BFDF +S31508000DE8704700BF704700BF40F2A043C2F2000335 +S31508000DF84FF000025A70704740F2A043C2F200034F +S31508000E084FF0FE02DA7018714FF00202A3F8442078 +S31508000E18704700BF40F2A043C2F200034FF0000239 +S31508000E281A709A6483F84320A3F844209A705A7073 +S31508000E38704700BF40F2A043C2F20003187800309A +S31508000E4818BF0120704700BF40F2A043C2F2000352 +S31508000E584FF0000283F84320704700BF30B50446B8 +S31508000E680278FF2A1DD1FFF7BFFF40F2A043C2F25E +S31508000E7800034FF001021A704FF0FF01D9704FF0C6 +S31508000E88100119714FF0000159714FF0400098711F +S31508000E98D87119725A729A724FF00802A3F8442048 +S31508000EA8A4E140F2A043C2F200031B78012B40F0EC +S31508000EB8B781A2F1C902352A00F29481DFE812F057 +S31508000EC8F800920192018D01920192017F011901A0 +S31508000ED865014F01920192019201920192019201D4 +S31508000EE89201920192019201920192019201920154 +S31508000EF89201920192019201920192019201920144 +S31508000F089201920192019201920192019201920133 +S31508000F1892019201820054003600740092019201EF +S31508000F289201B2009201CE00D300E70042783F2A28 +S31508000F3804D94FF02200FFF75FFF57E140F2A045BA +S31508000F48C2F2000505F10400A96CFFF7A1FA4FF0F3 +S31508000F58FF03EB706278AB6CD318AB64637803F164 +S31508000F680103A5F8443041E143783F2B04D94FF0F3 +S31508000F782200FFF741FF39E1416840F2A045C2F275 +S31508000F880005A96405F104006278FFF781FA4FF0B5 +S31508000F98FF03EB706278AB6CD318AB64637803F124 +S31508000FA80103A5F8443021E140F2A043C2F2000348 +S31508000FB84FF0FF02DA7042689A644FF00102A3F80C +S31508000FC8442013E140F2A043C2F200034FF0FF02A7 +S31508000FD8DA70996C43684FF000023BB14FF0000293 +S31508000FE811F8010B1218D2B2013BF9D140F2A0430D +S31508000FF8C2F200034FF00001DA714FEA1220C0B2BC +S3150800100818724FEA1240C0B258724FEA12629A72C0 +S315080010184FF001021A71597199714FF00802A3F835 +S315080010284420E3E040F2A043C2F200034FF0FF0277 +S31508001038DA7041F28042C0F600029A644FF0000264 +S315080010481A715A719A714FF00701D9711A725A7240 +S315080010589A724FF00802A3F84420C7E04FF0000040 +S31508001068FFF7CAFEC2E040F2A043C2F200034FF0FF +S31508001078FF02DA704FF000021A71597859719A719D +S31508001088DA711A724FF00602A3F84420AEE040F26D +S31508001098A044C2F200044FF000032370FFF7A4FE31 +S315080010A84FF0FF03E3704FF00103A4F844309DE0C6 +S315080010B840F2A043C2F20003986C04F101024FF013 +S315080010C83F01FFF705FA20B94FF03100FFF794FE04 +S315080010D88CE040F2A043C2F200034FF0FF02DA7038 +S315080010E89A6C02F13F029A644FF00102A3F8442071 +S315080010F87CE043783E2B04D94FF02200FFF77CFEAC +S3150800110874E040F2A043C2F200034FF0FF02DA701F +S315080011184FF00102A3F84420417841B9FFF7EAF9EC +S31508001128002863D14FF03100FFF766FE5EE040F213 +S31508001138A043C2F20003986C04F10202FFF7C8F94B +S3150800114820B94FF03100FFF757FE4FE040F2A043B1 +S31508001158C2F2000361789A6C8A189A6446E040F2EB +S31508001168A043C2F200034FF0FF02DA704FF0000204 +S315080011781A715A714FF040019971DA711A725A72D6 +S315080011884FF00702A3F8442030E040F2A043C2F229 +S315080011980003986C6168FFF7A1F920B94FF0310090 +S315080011A8FFF72AFE22E040F2A043C2F200034FF0FE +S315080011B8FF02DA704FF00102A3F8442016E0FFF7A1 +S315080011C87BF940F2A043C2F200034FF0FF02DA703F +S315080011D84FF00102A3F8442008E04FF03100FFF76A +S315080011E80BFE03E04FF02000FFF706FE40F2A0438F +S315080011F8C2F2000393F84330012B03D14FF01000D5 +S31508001208FFF7FAFD40F2A043C2F200034FF00102CD +S3150800121883F8432003F10300B3F84410FFF7CAFD27 +S3150800122830BD00BF00B503B400F008F803BC02B42B +S31508001238694609BE00F004F801BC00BD704700BF46 +S30908001248704700BF1E +S3150800124C443A2F7573722F6665617365722F736FC7 +S3150800125C6674776172652F4F70656E424C542F54C5 +S3150800126C61726765742F44656D6F2F41524D434DFE +S3150800127C335F53544D33325F4F6C696D65785F53EA +S3150800128C544D3332503130335F43726F7373776F0B +S3150800129C726B732F426F6F742F6964652F2E2E2F06 +S315080012AC6D61696E2E630000443A2F7573722F6652 +S315080012BC65617365722F736F6674776172652F4FEC +S315080012CC70656E424C542F5461726765742F446571 +S315080012DC6D6F2F41524D434D335F53544D33325F2F +S315080012EC4F6C696D65785F53544D333250313033DA +S315080012FC5F43726F7373776F726B732F426F6F7472 +S3150800130C2F6964652F2E2E2F2E2E2F2E2E2F2E2E36 +S3150800131C2F536F757263652F41524D434D335F538F +S3150800132C544D33322F43726F7373776F726B732FFF +S3150800133C766563746F72732E63000000443A2F75DA +S3150800134C73722F6665617365722F736F6674776136 +S3150800135C72652F4F70656E424C542F5461726765D7 +S3150800136C742F44656D6F2F41524D434D335F535463 +S3150800137C4D33325F4F6C696D65785F53544D33321C +S3150800138C503130335F43726F7373776F726B732F91 +S3150800139C426F6F742F6964652F2E2E2F2E2E2F2ECB +S315080013AC2E2F2E2E2F536F757263652F41524D4378 +S315080013BC4D335F53544D33322F756172742E63005F +S315080013CC0020000800200000010000000040000872 +S315080013DC0020000002000000006000080020000049 +S315080013EC0300000000800008002000000400000034 +S315080013FC00A00008002000000500000000C000083E +S3150800140C002000000600000000E000080020000094 +S3150800141C070000000000010800200000080000007A +S3150800142C0020010800200000090000000040010807 +S3150800143C002000000A0000000060010800200000DF +S3150800144C0B00000000800108002000000C000000C2 +S3150800145C00A00108002000000D00000000C00108D3 +S3150800146C002000000E00000000E00108002000002B +S3110800147C0F0000004F70656E424C5400D3 S705080001DB16 diff --git a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/hooks.c b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/hooks.c index 5b31c733..85f88c6e 100644 --- a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/hooks.c +++ b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/hooks.c @@ -97,20 +97,20 @@ void NvmInitHook(void) ** PARAMETER: addr start address ** len length in bytes ** data pointer to the data buffer. -** RETURN VALUE: BTL_NVM_OKAY if successful, BTL_NVM_NOT_IN_RANGE if the address is -** not within the supported memory range, or BTL_NVM_ERROR is the write +** RETURN VALUE: BLT_NVM_OKAY if successful, BLT_NVM_NOT_IN_RANGE if the address is +** not within the supported memory range, or BLT_NVM_ERROR is the write ** operation failed. ** DESCRIPTION: Callback that gets called at the start of the NVM driver write ** routine. It allows additional memory to be operated on. If the address ** is not within the range of the additional memory, then -** BTL_NVM_NOT_IN_RANGE must be returned to indicate that the data hasn't +** BLT_NVM_NOT_IN_RANGE must be returned to indicate that the data hasn't ** been written yet. ** ** ****************************************************************************************/ blt_int8u NvmWriteHook(blt_addr addr, blt_int32u len, blt_int8u *data) { - return BTL_NVM_NOT_IN_RANGE; + return BLT_NVM_NOT_IN_RANGE; } /*** end of NvmWriteHook ***/ @@ -118,19 +118,19 @@ blt_int8u NvmWriteHook(blt_addr addr, blt_int32u len, blt_int8u *data) ** NAME: NvmEraseHook ** PARAMETER: addr start address ** len length in bytes -** RETURN VALUE: BTL_NVM_OKAY if successful, BTL_NVM_NOT_IN_RANGE if the address is -** not within the supported memory range, or BTL_NVM_ERROR is the erase +** RETURN VALUE: BLT_NVM_OKAY if successful, BLT_NVM_NOT_IN_RANGE if the address is +** not within the supported memory range, or BLT_NVM_ERROR is the erase ** operation failed. ** DESCRIPTION: Callback that gets called at the start of the NVM driver erase ** routine. It allows additional memory to be operated on. If the address ** is not within the range of the additional memory, then -** BTL_NVM_NOT_IN_RANGE must be returned to indicate that the memory +** BLT_NVM_NOT_IN_RANGE must be returned to indicate that the memory ** hasn't been erased yet. ** ****************************************************************************************/ -blt_bool NvmEraseHook(blt_addr addr, blt_int32u len) +blt_int8u NvmEraseHook(blt_addr addr, blt_int32u len) { - return BTL_NVM_NOT_IN_RANGE; + return BLT_NVM_NOT_IN_RANGE; } /*** end of NvmEraseHook ***/ diff --git a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/ide/stm32f103_crossworks.hzp b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/ide/stm32f103_crossworks.hzp index 4da11841..014e9b76 100644 --- a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/ide/stm32f103_crossworks.hzp +++ b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/ide/stm32f103_crossworks.hzp @@ -1,7 +1,7 @@ - + diff --git a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/ide/stm32f103_crossworks.hzs b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/ide/stm32f103_crossworks.hzs index 4239ffbf..18ba1cfe 100644 --- a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/ide/stm32f103_crossworks.hzs +++ b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/ide/stm32f103_crossworks.hzs @@ -60,7 +60,7 @@ - + - + diff --git a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_GCC/Boot/bin/openbtl_olimex_stm32p103.elf b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_GCC/Boot/bin/openbtl_olimex_stm32p103.elf index 96038d70e8d2daf7b9e5bf066cfa7d637d5e52ad..f8e0bc0302d63cb5368363845c306b9d72916ff4 100644 GIT binary patch literal 104314 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 BrNRIJ literal 104446 zcmeHwdwf;Jz3_+g)N|BY+n^}XD!Je9%$l{=4oE#c=YH<} zV=b6H^Lxy1W`6UV_pFu67S&ctDTR3~F-15~xCF?7OQf)b2$qNl{3#+`q-pwqiV?HI2q(Uh5&=G(L3~L4S9F5@<7>dzfUf~x1HJ})4fq=HHQ;N&*MP49Ujx1d zd=2;-@HOCTz}JAU0bc{Y27C?p8t^sXYrxlluK`~Jz6N{^_!{sv;A_CwfUf~x1HJ}) z4fq=HHQ;N&*MP49Ujx1dd=2;-@HOCTz}JAU0bc{Y27C?p8t^sXYrxlluK`~Jz6N{^ z_!{sv;A_CwfUf~x1HJ})4fq=HHQ;N&*MP49Ujx1dd=2;-@HOCTz}JAU0bc{Y27C?p z8t^sXYrxlluK`~Jz6N{^_!{sv;A_CwfUf~x1HJ})4fq=HHQ;N&*MP49Ujx1dd=2;- z@HOCTz}JAU0bc{Y27C?p8t^sXYrxlluK`~Jz6Sok(m+T=W~YeoRNwuN=pb!R@ApSl zjjopKMpxfZnY1LS#y(I#6c|?lmr#9O`Or(rRms)M2Zgn>{PCwthXT_-`JEVi^W(j5 zrnymKnL1|^JJFC57iTsmg zty!1Vo-??kH|Nm6tSp8P4di64TLb?HXv+^xvTg^qTv6xLjBB?KiDGe!yh9d4-W|D5 z$lFWbf34y6^1=Q2pr#)Z3+(;*Ro&TQ@ZC>ls?^eu8q=_qUp{ET&#hV0z6Pn39}@N2 zA6QR6=g=jiHT*Vw=5?SqYh5Pfj2;x1eXb6P?|-!e(q_Hd ze0xXvV9>g~IR&wD4)v^O>g9(Dl@GXF!vpZep#8BJO#1lKw?vv%D#Y+mKkQjV5Dv@I zzkU!uAS!zn4}1{6vuE*NKL|TeSV5x)NExNVX)2ti!s#lUuEH5AoPn_TVb9`HxM$#Q z{AAZ)&*FV=FHe1DH~ps60r+)qi`1UQKYF`V{np{P>}??sQ=C?F#lzHuuC=*exYk6D zyjk4Lva@EVLK_zJBW{+r%UPh@o`t&G{o$_egZovz6=yyza|P;DPA}O%>2quDM5pHd zeyt^aZmorC&Th8{lkD*HkN1aaVAbnyUuQjxvOaCom5D(H993e}=#lN!ud^Z-OmshgDyLif@nlWrR_a2v-NA{ViJUc{tp?4m zIg;~gkCl_T`M#lr5seFip4D@E>-M3F2(h>KkXt-Wehae1T-2`Rs>w@VkU+HKE)Oy}l z^l?MOxo`BGxAnfxmoo2bJ%6h#?l?fq`R!*Y|DMkC+eJ>`z^Ea4wmiLl?2Eg_^r8LF z48=ucPR{0*&G&5%=hi9Cc{TU7irid&C`#~XYeeyu<}ke$m0nBly_@555xa0S zVsx~N!HkbHpC~GfKOhFTsM1q%;6PDC9Ee1Q4}W&#D?=59w6`=sA03ISdTeN6n#|n+ z?B2Hr%Z3l{`(N-cXZ>G{{_Je{X?unb|MrNSlDaQkn+sb_+%E>leOxpp?zb$b7<|XE z@CmTb`@tW8J*Mr+0_7t`89w}nr-|=b+_N~m$F9j-XV;8fH+*<#_|vx@0RBO^Fj~tK zLxqpnHOtYfXRWg^9^AG#yqDuqAR@v&dy*>0RE8?!4rC0;)8!c<{0<-f&G19J#mo=) z_v{sefB9jsCTr*D!H8w=yJM%_L#s_g4~%|cp(qXSiC5GCD`DSl1MV z4x|q4lacV=w8}8rp5kSjxcv6Zv#z-PimdIW?{6k_&CR5bQVD-=!UZ{?*vbe$s{x<*cj$ zjXwlg=x+dtrx~W5yfGZC2`&+lHS2;ox2?-sN14Ni|NJ!NEEp?A7(BljMy#FTy^Lem z1eUB>M^}>bD$--$ohvsk`pz|f{iRith0%Dx%4*j5o;@NjR5=+s{@oGO=2^Fv$G!;zl74?wR&djgfBefaPnhli)k-8X#r zx#0;lzi%HiD1#QD=ZEtTFdd0>aw{7!J39BQ?`1x^`#bftl5ZRtUGuy4^g)?Aw7)p% zVr4mZ9!b_Xduab@?Yql^`vbH0d?+sa<9?YZ4vepa9d_g>dBcalK8*QPUZiq}wuQ0{ z?MYY~S1I!HQHrfcreE}AxxGIrcWp)CSwnkeNz&}p8Sn33J~&)Re&+q>!55Rmd+MLC z+OI8---o%|IJA%6;lmdmq0OS*>{Y&)yC=COPPM^t@wLoT zq;e`!d}UZn2|q26%K$KQk;V}10qyHkOGMb8-&Se2XCFFp;iCtK7X)D2Csdw1Xvf+6 zPetq}hF3qD+x{eEM=A+FHyo%Od?dI1y{xvef!V`{(~jg$csJ`&Xd>>VNM+oIV)O9f zN5Ql1k>CW_|LNg_!*eIWQm6Mkeo&+a_Q~0Az7>IW4qh%J{I!>$oc-_~Ag? zW99KR@4iG!!kibWZAFcjgn#}gV>Eqg;$xK3veI_%}^P8Z;`Zr#M z_Z^gCF7>mR{c9L52`&vT11=M;E?b0Cm!$96-~N^M^a=Itt(o^{zS@3&W>&}jnQJ=k z!0(%xt>yA7!-s!7yrVp{FOZ%5uCxN^xlV%B%gA`gz9=W53O#>2t%{nQb7b`+aa9_o zrRE>e^9*gxrmkew9Q2d_`P5phPkO(fuq45=t_iDkO}HvNVqG(Q_<<+9>lrlU5HDDv|Q^#6wLExj#m1!eV1E0z{FH8d_Qo>j1=xwjv@Y#Er(qc22I zl@H!o~86ME#0K>a`PREHB7UZ=x}3=imV z62rT6IGN#RbU20K13H|F;BgDKxT2!qg0`0a?%qCCKF0MQUjx1dd=2;-@HOCTz}JAU z0bc{Y27C?p8t^sXYrxlluK`~Jz6N{^_!{sv;A_CwfUf~x1HJ})4fq=HHQ;N&*MP49 zUjx1dd=2;-@HOCTz}JAU0bc{Y27C?p8t^sXYrxlluK`~Jz6N{^_!{sv;A_CwfUf~x z1HJ})4fq=HHQ;N&*MP49Ujx1dd=2;-@HOCTz}JAU0bc{Y27C?p8t^sXYrxlluK`~J zz6N{^_!{sv;A_CwfUf~x1HJ})4fq=HHQ;N&*MP49Ujx1dd=2;-@HOCTz}JAU0bc{Y z27C?p8t^sXYvBKD4M@ulgyO>S;@%|zIZ94WNl&y>#-)ssqh%WYZlaYZ5)=JC%#{=H$;nIt zGZTs?VIjphFQ3Y?;tB^{Eii-e9uScdQc-DCNTN5kN#(zjYp430`cXQLb1DQ0vVOu& zbva=CNvgsVq^wS7@e;EE7eLENUK2<*CXixGAk}LEX|X0SD%J!>drcrc-%$)r02Ss~ z1eB~TVoX%MLY&~LC-LN@s6CwMu?PGa(M)3xV~sszx$z)3S}Efo+p$zu-S}uy1Sdp6 zZ95Yk1T>`)le`F4>)*GoXv+%Zi>P($vV5)pZ{swr8V%grPTdm5XvP>PvdsL&nOY5- zS~Z491{xylk{WTqL}QmpM`ae$lD){Nv8HI7`y5?-fueYgH56;Cv|T5E%63h8;!SxH zM%qtew57p@O?i@?a;jb^C2E4&HiSUeqdP6Hxuiu!QJJH>#WxX0dy!F{q(|jdr)$Gz z*W?(V5Mz#AeJ406I@NLF1axamN%wo190c#csWvuVew>mQg| zc+2xSJ=Vx(?rGN}hbXPZc&8DehchjUBNY2AXX--R_w-rr;}%9C04KfR8f} zQx<^n##j=(LXBQI6Y&gBrf~nAb~LiOohoBDKC)Lg)$PfFsVMaCBSuYCR@2MVrXlcX zn}%V;RD85Vo+&4z{^ON%yaIw2p z0C4QlgJD**1VV6H=ByYnRJj#CqRUIo{J_Kt4cPx_ZaqqB-U{1 ze>eZG9zSo6iIPO~MJtL9Nk_$1HINWxch+ZX&;%_w%x+~de&q!GEP#7hiZC65!jj?1 z+RLXGh?|GipCv;l6SCs)3oi(}B&`fII}q&X>WAssK#6G}IMQ1|q;&7Y6u)>1_C-v4 z_PLCt6AS3X>}5=N+Ehgdo=xCN{?wg9OgOlT@xpPZzzco}sE`cAS-TO4dka4z+_0!o zND-eGxY8~KPeNHmy$D=w|1)S-u1Ne0eqg5q1`p>lKz>LH%Gjj(WFjFK=BmBNy z3om|3pd@e}OhuJ$PQd8pAqqUj0RssY)etz>0mF&e6mY5oCM6~kJk0^q5?^54(;YA) z@g{=v956F+ESb-6!10M+BXzz5MiMHh@&yi*R<^QE%6~z2Q|?gE!zOl?%%Yu?f(rj(k{TyZXkaGq?|j-1V?WN-nyxO z^p}<2lm0dM=tKFF@g9DHzY4{p2}l{F*jSXP!BAw0VwO@jy}5|(Z5(Nca|_5$OH&4J zO*a;`7@k#sdyP+s0qo*y^0h8j1}+uWx~JL zQpxv;=B34Hsee>bl|JI+AILo@CAoyH(ys?9+{N?<6{nK=4Z@#kspJc3-T_zYu;OL! zfxJ#5cM{YKt|ZO*0HwYcukdbO1LVuJR8;bf*1W%VrDj>=y;MuRl-wsb9+i3%`Ic#^ zuW+T-Dc&cw)H@mb97~d`P;-8pQgbNfoT$|62%oQ|lCMPbz72G|($@Kk_f<&MdEca9 zwgJ@jr%dHy9h))d>ewftY3SG&Ta92$0-KI~sfs-bFk)|D+Sgff10cqnr(?Iev9Ghr zL7MNzzCp!ap=008*mvl(8M9o+zSoU?hvM#WV}D)2+jVR-cp<-I$wDN+m`il*1C0GO zjPal`e6Jh(A&abg7&{@rAleUQJZVW5k@4%bjJ$x6@ubD@URTCmrHy@B24e-~w*kms z=u$BLYAvJPmGKLU;a6N4zf`4oSIeNu1?3CO$7@;!s$?yvtVFpNo;;#u zQOowak81~JRMQxG;)N^qFqio;@?mXOT2@OIo;`ls2Fc|`cp7{2;Ap(r?Gt~ z6>latF&*b75}Y~E@jA}+;0yKJcd$!|JBU2mUuO`LiMYdr?z)kJaszS8kSY6a4Ta;T z5Za}oq;Lb~681eBN()yIx>rLP;fAU@Vc$o)v2ruxPGP+JH7zfW!;bwg8k!QfozOQl zG$XEy&^I+y7oTAtw{vau@845)!N;WRzf(@;{Hp6Y2RElp4LG?X#Qnd)gUGtHUmX>j}~XR4>c zh#2im^_b06HP=G+mH0UU%_BxVgtB0+rNKa&GuP5!c$72O(qIx!X~2A%!<;tCnQLik z#wcg5rNPWm&Rk1_<3~AjEe%G}oVk_;^TcQ~*Fsj)??5)?eNxJd6o!6hOG&F4qo!TI zw;5-Qns@22I6+pB?`7GEW{y59ybDr31M0*J@N++qOMsLidE$TF6F6qs zzY48HWX#*H05q`=gy3w7kWyLhg&-<}OBEAupnz}gQ0(#7zzc4~Ppp_plpya_5`uOb zc6ul2XwNWOkm*L^pEGgAPQaG9323J)`xAoRuIvC9c5?do4=&6CQZnJ0lA8KYIE*Ps zD}l%|NyHFbFY|RR%*YZiM)Q&mCU0Jb!1NaLLZw*wB>-)mEqGin+D>12GwDT|u9uFl z5L3)?-PWr}+nL42EbM}ED)?l%WS;VZB78G4^KC>5JxKgQ1~Ca2an%U?5H8%0ABjNRp+DeV1g+wQ#V-WVw#G2jx^S5Z7+-MZ`a$@Wgd$eCS_^ zK4m8o3fdXSV+tdRy;QXLI%tk%Oa{VR8|x6^hu8`D+}f~svS1Z1g|MS5##&C|tn*0J z%X_C{EI~rab`qSGzFvp3dxab>`ki${uvVUx0x%ShY{;`4!GIwzbO)ie8j_*agwD~B z71}}QTt>2T?a)sNHECK!2wRP)LpE|NcVXP7{$?SYuT@Z$2$N|dqQx^C3xxFsmA3vq z010nVinOF$2zsKbHfb@8lT}7bm_&wZFtoW0)tVvUagtg=8gNOi4(WT$&JK|7a7jBH zQaWSZ3exvo(yb2ZTE;3vtK09A$^t4g30p`S6U2haC5;Jc(t46UK&&`)RJsTsII#|s zv=+T?zDruGN}8-Ja;;jbh?LXG_Dd;gR9m%SrB*YWSV|GTUgJ6-B<&OGZcxoqWt|u$ zpJd!Uk}MBsw$bu>#{H?XRpK7k_)&5r@vln4Kh?N|4~hCEwDGK)!(Teu_&OzH@+kl4 zlHPMje11Aq#;28S@ zpxD8ROzM+_FOm4kBobc)>RLslMoGAe#LwoD_#RN~Fhmx0O2We=vNWKEk>`gI7)Pz% z48r{+w%Fqr03KV6A9h4zPe$N32uv_66KjCM4mY1kYzq{MmK&C~oWy3s@biR2auQn@ z!><#Lmy?zNX86y9lVsL8ki~EaDw3Hnd8BwgaEmEFi75^MTjz70&!zBomMb6L+hmk|3Mc2PllHF|Mz zKcZRU2B4h|oCBY?1HTQt3$g3^xgEIEYsdD_pEGct0^#yJNz*$3_e17RP9w5X5-|k# zDv+TG#GTF|CTJsz5pk8u=bxhagid4fi9Is$D)addPeB$j%{h{J_yi7vWI!$@ZjmJX zsm6&nRZgaZ;Arfj5jpuOa#9rU=ES}cbgRJGCi{CE*3Ncv2NQ`M#^e>u%PEri$Ot2k z(9`$87J5M88O(xuLYFF#J4!PFia53E4}Xo=X+HrXXg>gj#s!{7IKB`+;V#mqzpiKx zf)=l~qfSLJEb%SSoN^{WyI#xS;{JhXIiYwpyVB!%Iixv@Qd>{7Sea(2`wCi=o@kjB ztuxWmgZO1SvUd=dzh)-OB}-lcSBkQIA8esN5x?+p1lOtJ%5Z@Ap!^95&63QGa2JA_ zgB-{2S9os1|1(eteZ4JUBlvBCYPf3V1Zpq95R@%s3*+qrnAqR#KyLsNVP|$Fp%{6I zWGbuSU^rq8$d*_Gf}^~dj`GMrcWMH)@edwjT!VIRi5*et&pFbOs(OZy;Z;oGe{K$J zMXP4S{A#?Mwi@Y$un?6q7{c@_jzyOCWS)W@t1{~7LMy8 ztw_@nLKXEzSVL)AQruS3iZv|-v{_guXPaTB1_zxI-NzE@a+SbW!XL37%O4ajx z%K8Stv<$|&lDU6^qDRSFDf(`e4~iLp`wb`quBf{y>M&5F)#BqGQiArwNNx1@8TVew z4%!Eam__OLO;w2Zfe`5=X0Vl(3Q-3^miPg998=$hptqlx0@00_=X|a)9(M_F%yH%O zjZrQ`>T<4RiFd%EF^1$K;+89I5Vup~{{#7tQyYuR%Mp}yVWrjO{RCFTsR~|BCRs1y z)f_z}S5eY7C5ck5*OJ&jXi3|=lD26{B0+9swEI*vM!8W(OO#E-?@@T-?u8oz?F&xC zEYXJ+?CA8nVD##AHFO%p((ia(h^>3sI>==_Ir+ypQ&^V+lr!&Z<(g}oS zXebc3s;m|*TSKr?jurMW%aMN}g7Gp!?iP7J%JQ%-XT1D?^v#m+^BR{R|An~ilJF}U zhe@DFd`qDz6|?>%nM7%|k{qAH&4zZ8<(=fYNs@_3@Pt=_kn$4o^A-Uev=7lxyU|Ts z%J>{TJ_I}T>TxIZ_^1m_YE8~y_STLieC5&U_+Ih|5wszsAyKW zT+DWbZP-u-@+GUdHneiX!a9|#)wcnR3s`am53xe`5!Ya%D~oL;0nznhG#M(5XZpiZ zSYye(lKXtYJh_@jE$UENu3?brbE8q7t)W1O`;2m}hSZ6&JVyiSKv|xv0d<}%n>3IS z;vS=1ry+fsESohnKE#yedJRQHqAKSe7P%!8v65!7yg#;B<>4uCXu3%+lKiqI3FB@I zamg!)dtIMj5Z42@1=Y_JsT8%)dflQ*z6xCGWn_L+ZT>$B7(1>+oNB2y$C#hO{TnDZ zGIot7GW-@}t138M#U2OSN^Jr`&avk3DomaLQTMWioK@MVBS zT7VUjd>50!js|nd^k*cB@YSHd%sedAMArK^DMOXOvI+l?GLqk*(7U860b|y~{R))P zSXJl}+$C9pzW}H8ahFOd4}wMVi;Vr0R2=A)!?(eegHq?leoE2S1DB%g>nRoc9u<2k zV;|IMGiGLz2tN(VYi{g=D)t{4Th+xu6?*~Vr6~J+Uy}D6z@t=m`@T9yyBP53J1G2+ z;+JQpxAyf5`Jv+e9ti1bqV|!3-vd zY3B*5$A6uw&q8gTs50?7Yiuq+y%2t#SzHA$Qz_t0GWP=%W1m5}RGrV1g;~@tdHWWGTtK`2@g~ixOBxGr$kiVvAWeHiT=Eo^3 z7_Y+EGk%Q`vGp(&Qdqdv$s&9M;y;QtL5eD%mh%vBTFtg(5q|+VRpmISHX4Qrt6YZ^ zJS7=RYHI0D2we!FcwJ&*7vQxZOk9t^jR;IK)W}7^d>5F=RS5iu0nYV5V&EMIc4wT|>q% z)c}J96PPAXLokn)Cx5_39JFyX70J7Si03q72*nnIh;E4spaN&ese_Ie0O>xktx>69 z`ogpS&%I(449Er7L2l?)q#?_0KrpVSzZdHyb&&*n8v&B-i%G8NL@+^K&v3D1xl7=n z*u*NLrZS3@F+kESz`X{S%%QeHr0gJP@yi&Dd)^Js0Tl~17A{`CNc2UL5a*3Msc*8B_3Ub<#!-Tc~GJ7Gy}?b@2!^J{^qwQss? z3Ff`B#9{@U3+a}47DA5Jy3$UxblxogKU8|O^w_wFRTDMwCT=9zPug+}wrOEqL5mlk z>>u0GPLk=Ct#Q2IWbaovmycJO>^EcipzN^y0dNU&Od+OrN+541+1CeTdV#_44w8La zz{7*NNZ9_SmnV~$N4-3}Ib{FX%acdUue?0di21#jhqry~cfpfmQs)gG`)^*%Tw<;Z zdU$x##=Zj>w-mfRV}D0sEL|?%g|VOXV(N+cg*Vn}VqWuNc-zE&&x_%m5&MXX`6tz` zrya9hkFc=gw4eWn1~;;md)tBN+t%0Lwy7!FK#wv?Ph&;XjWX&+J~Fz((vEo?Z@-Mw zl?l1a&h1!gr!TQz56&xHe%2Z7^JnEQIJ;)qf+9O>N$s+w=hQ5u^S#w+dmROI=B}oSa242be}Rp{Be7BwDe6nY11vDvtllWnBtFx%E#3v(yr&M#VOKYrP~BKuyMUu55KNq%v`q!}glpX~fu z*}3*3U&=2kDng)niM=lWB>SRBZb^3bxGDCTVE$HM-X%r$_$3R9!LzQ*{_`n9($v6J&v z@k1Lzixe(DG}}n!?zMfllqF~_Cl#GLA-CjL6N)Aj<<=HW&bH!FR}ZPu{{wZ^b-{?v z)hYY{Q=H2wkJde^ikrsv3o!eMQ5?5_?T=$|+}pM9!($lYv8ioDYjv{By;l1Tfj-eFoja}AyhjZxC7}%5XJs{HxLrK=RPE;l2eXNJ6LWHB znvRous`gD%<`t=Sf2Nuu{{tD`(AnJAe$4j3Ek66lL1ehFz_bT$@!2l}ca|vxH}^2; z%SeSX5BmZ&Z?_X8G?JOc_67au6tfLCH}mW#0x~k?jN-zx%a)xnDYwuuRO8#{FR|O_ z*#-HN*A&_-B6eZKbZp#(vj;+WV>Dv-Mk)&C+ZS!H6Y^bMai7h;3q#S2oXO<{HL(1W zliapS+EcciJP!Y+*zxo1-X(MFS^gd+RG{PLpQ6$@%+ zFE2d%tm53_MJJzPqr*>~mu==1+|jaM;P_QwYKEIx_UlqcN~wYx{#4H{m{gEkR0Hb@ z>x8%=WN)`*e(@Q#6LVC9iiEIRkw2>rddZ!z;0*f;xq(IOM-lCzFGbES$~kAcy=}Ff z(qCI>pEb`OzGU7qlP0%d?B84R#Iw%egYsGFIw5Yi*t;;%%98emh&?VcGiOpZN99S` zIdhh8o@^v=pT+*nk{J_oYAe>*+w$$?CD}^zm#fCx@n3BV1&b>x#PK`)3)))xyL%J5P8Q_uv=usIa3@9b~F;<IMimbe%R@opaP4;bm? z2qU4QIS|gtFYyZ4pb09~tqwr}2#XdtOZ*(W?Y{`b%Byx*m5lWcpyH(=Ukw%IDqrGh z0I}u3h5e(lt+n>mWL&3#BtCQDERhWY-!kJ)Dz%2`ey3o{jtb{)5nL@eP|=(%0EFm< zv&8qXMf4*mAto-hK+rKh@U0~5n$ zF`OlO#^BBcLNQ5_tjm{q0xn(=#4`=f688f0HbSf@if?Ie?p3DZNed*g7|s&co+!i_ zNSW6m$e;>wTy69_oG25s%|~bD-!g@3peup3#AM83Za`(l=VZn@i;kQ%kU(`EqYHvzhFX@97G#bZ-$dkgDCIpZaH7s#yu|1&5N%2ALR*g z2ogs02e(jYbzg7gmM%6uY|z75V$WnDra;sPZZh<>V>d6drK_)FV^>>i1U2oT7;5kC zKA*j;OI8N9c-hKGMMP~QiiM}G-O|^)c0*e;rr_9#+|Ykvb8p+)y_zy+r*YzJ^iVxU{K$Yx$N9 z8z5|XU1QCnv%m&Y{i;O^nQ~EmLu0+#u~ZO6F+U0$(|LAwcWsQQA6GY2nCUH}WMZ8i z(4NlDrcGNq`#X9%JCMG|78p(SeYF)e^`Z%Csb93Z3W2`1{-%oM%NpyK*8-|t2=tkv zr?+EibKm)*zq@DohPvMF7O11;e6gV!vK67J2}*BT+EC|6&>`aLT$~QoFIrVJ2V9C) zU%j-fp~i_*S+=saQNbO!Nf=B{W}=0zFRyNNkS1++>~S=8Cg@5x#c*vS{j?zceZ&mBg)7#a3*J^7O0HHJoUIa_o#>Ux3 zyb|VR_mFA)$NLe$y^6He)-fqQASoZL>qsu#;BBrd9{t(!D7v z*`XRK?BU&!79%cW>GKrP*4x|dw!)%0eFAgJTD)Nq!&TAQh9PyNMvxKoieQASe(0gz zIgIHu$zle;5~>k4Mjkj(#26H6ya#<|ED}oWHGB>1qF45Gb~m>=Oby$*TG|;_6{n?@ zZ|Uf4t!Qs+Ilp1cCdJpisb@=nn?m(Ds7Rw-P}^=dma+PZM4w2@+oL_8D#Hvl&FD_x=LjdAG6j!H*X zu4n7a1Ua0Ea+v2rY^mwS;s8p!Fk)R3@Eh8Cc}#Yc$>@DCy;Ie+p}C`T3r@K@JG$CL zncBUo)F@>(YLp$p%G1B2gt{AF6+K&)wrxW4+XM~<`vqWSK`SvT8+)g*ZdCSH)!fzE zi4kZ+Z}%p$YNH&f2k&@Yp!dFx&(h3eJ~Numc0+}3sK^b?azn*#sKgD;5qch|s@iGf z#3;=#Zp6@zDu$)iZ$*1$?H)H@&PG^tZs`$Tz71U!VPlpGf&RJ~E3DSGtuZtwCnoLc zE~QyEhGiFQI#Ss zI(|XT7Sg7U&d!d$HniB*rWR-Bq-aeSGU?@nA@ zl{yW@t)}8i0#a}6))Hdo?xskp*G9j!(UX0pP)@JWPw`}%T{QdS3%h$!KbRh>v~>tW za5Tl1Exo;MT^J`(Y%TA&HnV}{MhjFKZMd+bzolL0R3VrP4XWf+kv4SnMr*H+dDqD} zrRhQ@Rb00=8(3uuwX#c9wkj%{i)cc(!&&HYvxrH4L3HoNU8pn>*Sub=?Ap@T)>@63 z&IYbu{;nu@2d1g5zin&3=vm0V4`U8ye(g>l*VBMk0GirV9@Q+N5}h6!u0Uo^i%e;7 zZc#)Q2gL*?Y)5ug8@fMW)ZwdJmaL_2V5feIC?%$aw(qQ2-U2KF{bqWFFAZ zIyQ>gA&DpUo)`q@92>@q}Et6!S-XL7=t8int9XU z@p}&(?UOza)e*)voqh=8VxTet`n_;Lv02Q^x|_i(;G|gL39{6S-utCZ8~UT^Yr<7IL4;W z^JIkG0+aqS9AeWOR6#dqr2bl=+)|Mv0Yao`OoB&w2%6*wj)!A%^m&+!aKuYL2{

I#P(H(PM-(0;C1PQk2rMtJZAOMd7yfl#tHg7G6mgL z2I-}6$Q?bBJ=J8WY@sH{Wa))tj_LCp6=Ao#BK-n5NTi2*>j*af0p0-}9EA724jP#k z0lZwH>I{lv7{L-nchhGq$T5+LHmvu%WL_IlPZZ@=tRXSKN8p%$`aI|L=AZNsaLB(m z3Q=A)Fxo5~RnV{3VYgyPpAQEy^cKO{qUVykmmpB9@yp=V>7Yr8vB-*Hk&G1T8B_W4 z#ws{woj%W(5q2w+^bRDcv)U5WEwPiPPs< zwO4PXKLLlt>HS;<8|nQ@W9j`xW9c2zSb9ki#l{6MMFs2VF#%6Iqx|oyI4kJAsDkb& z7frpMssCD0-MS}rmqIm=g4ZD+c{R>foupTfMi6iQ5NotSMxDo%^vDct&`W@`#TI!t z13K?3jR1u=B8<;7e7x$UR7ao3_1=0T{d72}jvmRLf=8(Z+v{qB`N? zM87z7@~L@ln_(IQaI8)GJn~04VzNy7)o{oXJ-lt;%~F)Qg4BlxP;ZckRZ9@0 zNKapKEtsxXjCJ&$SHYExqZ!>iGp+AvMtZoj&7{d#s)BX&bR4%6zVnO3(RquB(W7b{W?hRA|0eRpo8?Tf=l2eyDl3& zV9woyuhnFe0bc)j7>-s$pVvIRhP=Vmar;T$il}#1#q{}phnL<8 zxD!r_26|WPpvllYNLvU8D!nEhG*ldI_Bx4NF6Yd4zVa3OdJR{}~0U#57Fs-NQw` z59S`C{V)ntsn0FC2X55tIdIX-9sCZP=Om0DS<|3<(B*77@|E-v6!Bf)aCGZA{9*!A zR08H&M>8Pzu<8N_P-jdCJD(6S7e1~4h9^%vljBFac*?}1tq+}W?1@t`>I59vV08`% zqQ^;Mv8K7_5*||12og>u_^gGCULWDtj&R(da>8%5GVD1%`>IAAeKx|+`+#@EsR!j3 zDf#BENGBk3GNBJ6F85$mvVhf{1xuJ4B+bB>Gm9-cY|bsn9D$2oF1Zj;>=^|RqFnKq zD;@~yCeLNg1gWETL&;Z^Um&j1Pb$P;5%5#;y7u! z*F~5kvm1Yp4(om0cQv55g>#U|(OdJUX{_2F2De%#Tlj2^zCS{HQaj~(SNvB7bjxY(Uk_NlSEu0W^{Q|m4nS;xao z(GqCDJkKJa`(;h%rYOe>ZiXVeY8R9+cRvYp+mk-GJLz+ulm2MO&vbllXcEtzO#0lx zq|dEOro;_N`rKxu&&@;9%i%LU?*Gx}&K~jH!lTcPIr`jgqi>!(1avn@X?QmrbdDtL z*k)>182zL9*qdoSZfTtW61T2Kd-xV2tgo(VK5kvj0FGN!m51;ZLfKPdRqk{fV;lJ&vr##>+bvI4R;TB0DaNG)U zmx6#bAG;XMr?*B>f8ax-bswgwdl${e{SU7kmQ`O?)AS6i$s@p(IDR91O#u?mJUHEl zXe>7zm_|Q*%Ho#76!={3*TLs1-dis^KChYS_*}L##CzfNc^8~M?|;+hI^J7fIzD>` zQib4sZPo{GX)_lu$%rpd>Z`CRy1CSMPqt5)it z3&@k;H^N^CpDUjM_*_g;pIk1~!siVBHTax9a<0mmT@`#z*Gk}DY$p*oNuY zhUwUb>Adn7W}BsB+cfDg%r3?zqhlMR;~tseXS-sXqGOw)W1FI5o1$aeG5id(4biDK1fOk)j%|pJ zZHSJ$FKkC_Lv*SQq1~_z(XkEDu?^9&4bia;(Xp+VbQxxwFfiK*mpbOfbc1Kx8peZf zw_K8vl&t@d18`=XEK5mS^krFkg;jdFT{;lJqA!-8F#7>BZW`E(p9W@oV`dC&#!~~E zan-=?`0B`Kd*pa$=xmo>nC;UGvz>ZjwpTCAcI$=BxNPK`@!7y^&+KswY{qK?n{nH~ zZ0Fwcvb}rLW83$_Z2w-E{eXeJ^~1h+7sf^Q3!frfo)T7hB2M)aP9D8+*bnn>Pnfa3 zEG1luI^DtX(9q2I@1?OUUODWW$0L%N3&1uiy|zJFq?Zb&O}X=yC?RaWVhb}5cUnJ($HZ%VeA&!xN7f}}?Eu}(ZBg&luyxg6lb1AizMJ2-4POXfFY^2Pd$r$gLh3qF zzPfajzaAF^^IO~2Z^5Oo_3L}vE-+9B-~MqZ>L#cY?%A?ly~S*35GwL<$$3*7E{o;k zT4sK8e}8YsdR*>xCF3@hVMp|?=1oyjGd8<6M!{HU1HLTNhJt;;hwmw&TNboOJYg{) z#MM|~nkV1{vf+~tT^64RA&v*;F?=Tj5r!il=#dQY{TX#{9>X^S2+A`L`Cj6yNX}zu zrvWx$lHS5+-hY3R!{nh=dcveWJ6noH9Dtn1$fyTw!X(94O0n5w%0pZ4gbT@p=OTP` z`V$(A^H2ueCdW5?{bx$`Dwo5ic*w`?P3WY@;O_z-_x;Rc@^lptCQRB3;Oq6&hoRjx zg0F0&6t{TvZ20aO!S^yY;)k3{qn#Jb zK1wx!-&FOkt^tkyx&G2PU0PmO?4zY!hZQuYUXaGq3kc4HuuUUctA z%jbGc^XT;7^u%v5k>Q*8(LEx~AHmwj#HT%S&1PWccb*3(9dlHdPMB*oFaK%}Ogh(Y zUV5tsCY@_JL+?O<{TYjZZ3nEs7D%$I;41A3{4P8c8_%|FBKkW&TUKQ)gjKi7sD zC&kwg*aVn8m1)oY9y;^4)dN2ScpG5k$>rbap_89$OL%y+e((3dq;svQ$PWE64@^4d znlbceJuvB9i+bbV@9v#R@e~OB`wL{i2h^1QR*R^9eg-_@T1D6Tde)<_{lJ^Y=qtKs zr{%roNsswC;DKo`hdl6WfbU0o-ufgAG#;IPtvhU`igz?Y{hIWndxP5Ex%Sm;IzM0W z#Q*Ct;&UzRyY>bi#(t{MNGa)RQW{NWg~=8l~-xdjnpWdjnpWdjnpW zdjke$dT)BtwpE2gfL1bPrsrkA5UWzSkbdd(vZmxKE)4V$KbD zQvq`hWbCoTLnlA?F%19z20#ATg*yK+{GA>;`MIxQ_&HW?27EmbhJVOISNie5hrs_C z;6e}o6ztC%dF1ClhYLedGXZnSNBN|4ufx!@Kwk-Xp+l#=T<@WipL-vMe>(WT26zAn zBaeF?hR*m?JTT*P55!CF@xY{W55!Ba!})=MN$0+Yfhqq+4@^4uLA>-odtlPJ58|aq zM$DHV@W7{|e1soE1T%i2PmbvLwpa{0;Q)MNf1g@W`byvld+8W2ohMa|hy9-PSROnP z^$U#>=J=^$-5$4(fY+u*>HI|d$C!W3Km>eCM{ERK1bx;za4+C=%n!NJB7FexXBdw% z9r(+DXG8v62fh>VBWRCoALM@k@DmvCY5#=z*JANU?_BzGfL8!ca_GMYj6XZ?rpG^j zRRow_5aWLUct7&XbAH0mmH2m0e)xw|+dT0x*B1>QcpTurfgjOS{F4AnIFu}#Y3={DhKA@!J6dZ=a+!WJo>l+ z@MI62e~Oo(Bvay88Sz z>5^2^4-UTxcq;18=>IQ(E07-}?=awdFdj|;KjmW*F0S$9Cmt~7k`XNr;~n5+PkF`z z{u#={vj@h{2aG2|d!RnK5B?$aRRWmwO2DTgKG_H_Ltq8gm&P8~0zSuMFMWV-0Br2- zV!)R|Kd(9QuLArC;`5#iCDIWD>iB!P&8}@E~ z#{&M?W53yeS0XSGEm>NBD4_Y02ov4asfwL`8yL(rnWG_VEl zD?_a3GT^b_=0{fetpHD{PMtO40|F@Nsl_fX`eHxvB|^W9f4sNrH+WyYc3zEE*X?TE z*U;T}s6E&7Jg;ZFWcM9+6`$7zJzPh<)$Ms7UFE@ff1XvXqUk!|tJ*4rORnl7qLQue z6~^99j=kp@d#6v`d2}v0qUw*nvI^co7EK$U4k=5)Etm3`;S z0Oq! 0) - blt_int8u result = BTL_NVM_NOT_IN_RANGE; + blt_int8u result = BLT_NVM_NOT_IN_RANGE; #endif #if (BOOT_NVM_HOOKS_ENABLE > 0) @@ -89,14 +89,14 @@ blt_bool NvmWrite(blt_addr addr, blt_int32u len, blt_int8u *data) result = NvmWriteHook(addr, len, data); /* process the return code */ - if (result == BTL_NVM_OKAY) + if (result == BLT_NVM_OKAY) { /* data was within range of the additionally supported memory and succesfully * programmed, so we are all done. */ return BLT_TRUE; } - else if (result == BTL_NVM_ERROR) + else if (result == BLT_NVM_ERROR) { /* data was within range of the additionally supported memory and attempted to be * programmed, but an error occurred, so we can't continue. @@ -105,7 +105,7 @@ blt_bool NvmWrite(blt_addr addr, blt_int32u len, blt_int8u *data) } #endif - /* still here to the internal driver should try and perform the program operation */ + /* still here so the internal driver should try and perform the program operation */ return FlashWrite(addr, len, data); } /*** end of NvmWrite ***/ @@ -121,7 +121,7 @@ blt_bool NvmWrite(blt_addr addr, blt_int32u len, blt_int8u *data) blt_bool NvmErase(blt_addr addr, blt_int32u len) { #if (BOOT_NVM_HOOKS_ENABLE > 0) - blt_int8u result = BTL_NVM_NOT_IN_RANGE; + blt_int8u result = BLT_NVM_NOT_IN_RANGE; #endif #if (BOOT_NVM_HOOKS_ENABLE > 0) @@ -131,14 +131,14 @@ blt_bool NvmErase(blt_addr addr, blt_int32u len) result = NvmEraseHook(addr, len); /* process the return code */ - if (result == BTL_NVM_OKAY) + if (result == BLT_NVM_OKAY) { /* address was within range of the additionally supported memory and succesfully * erased, so we are all done. */ return BLT_TRUE; } - else if (result == BTL_NVM_ERROR) + else if (result == BLT_NVM_ERROR) { /* address was within range of the additionally supported memory and attempted to be * erased, but an error occurred, so we can't continue. @@ -147,7 +147,7 @@ blt_bool NvmErase(blt_addr addr, blt_int32u len) } #endif - /* still here to the internal driver should try and perform the erase operation */ + /* still here so the internal driver should try and perform the erase operation */ return FlashErase(addr, len); } /*** end of NvmErase ***/ diff --git a/Target/Source/ARM7_LPC2000/nvm.h b/Target/Source/ARM7_LPC2000/nvm.h index 943ca0a2..c143d71a 100644 --- a/Target/Source/ARM7_LPC2000/nvm.h +++ b/Target/Source/ARM7_LPC2000/nvm.h @@ -51,9 +51,9 @@ blt_bool NvmDone(void); * Macro definitions ****************************************************************************************/ /* return codes for hook function NvmWrite/Erase */ -#define BTL_NVM_ERROR (0x00) /* return code for success */ -#define BTL_NVM_OKAY (0x01) /* return code for error */ -#define BTL_NVM_NOT_IN_RANGE (0x02) /* return code for not in range */ +#define BLT_NVM_ERROR (0x00) /* return code for success */ +#define BLT_NVM_OKAY (0x01) /* return code for error */ +#define BLT_NVM_NOT_IN_RANGE (0x02) /* return code for not in range */ #endif /* NVM_H */ diff --git a/Target/Source/ARMCM3_STM32/nvm.c b/Target/Source/ARMCM3_STM32/nvm.c index a6bc6040..7aaea39c 100644 --- a/Target/Source/ARMCM3_STM32/nvm.c +++ b/Target/Source/ARMCM3_STM32/nvm.c @@ -79,7 +79,7 @@ void NvmInit(void) blt_bool NvmWrite(blt_addr addr, blt_int32u len, blt_int8u *data) { #if (BOOT_NVM_HOOKS_ENABLE > 0) - blt_int8u result = BTL_NVM_NOT_IN_RANGE; + blt_int8u result = BLT_NVM_NOT_IN_RANGE; #endif #if (BOOT_NVM_HOOKS_ENABLE > 0) @@ -89,14 +89,14 @@ blt_bool NvmWrite(blt_addr addr, blt_int32u len, blt_int8u *data) result = NvmWriteHook(addr, len, data); /* process the return code */ - if (result == BTL_NVM_OKAY) + if (result == BLT_NVM_OKAY) { /* data was within range of the additionally supported memory and succesfully * programmed, so we are all done. */ return BLT_TRUE; } - else if (result == BTL_NVM_ERROR) + else if (result == BLT_NVM_ERROR) { /* data was within range of the additionally supported memory and attempted to be * programmed, but an error occurred, so we can't continue. @@ -105,7 +105,7 @@ blt_bool NvmWrite(blt_addr addr, blt_int32u len, blt_int8u *data) } #endif - /* still here to the internal driver should try and perform the program operation */ + /* still here so the internal driver should try and perform the program operation */ return FlashWrite(addr, len, data); } /*** end of NvmWrite ***/ @@ -121,7 +121,7 @@ blt_bool NvmWrite(blt_addr addr, blt_int32u len, blt_int8u *data) blt_bool NvmErase(blt_addr addr, blt_int32u len) { #if (BOOT_NVM_HOOKS_ENABLE > 0) - blt_int8u result = BTL_NVM_NOT_IN_RANGE; + blt_int8u result = BLT_NVM_NOT_IN_RANGE; #endif #if (BOOT_NVM_HOOKS_ENABLE > 0) @@ -131,14 +131,14 @@ blt_bool NvmErase(blt_addr addr, blt_int32u len) result = NvmEraseHook(addr, len); /* process the return code */ - if (result == BTL_NVM_OKAY) + if (result == BLT_NVM_OKAY) { /* address was within range of the additionally supported memory and succesfully * erased, so we are all done. */ return BLT_TRUE; } - else if (result == BTL_NVM_ERROR) + else if (result == BLT_NVM_ERROR) { /* address was within range of the additionally supported memory and attempted to be * erased, but an error occurred, so we can't continue. @@ -147,7 +147,7 @@ blt_bool NvmErase(blt_addr addr, blt_int32u len) } #endif - /* still here to the internal driver should try and perform the erase operation */ + /* still here so the internal driver should try and perform the erase operation */ return FlashErase(addr, len); } /*** end of NvmErase ***/ diff --git a/Target/Source/ARMCM3_STM32/nvm.h b/Target/Source/ARMCM3_STM32/nvm.h index 943ca0a2..c143d71a 100644 --- a/Target/Source/ARMCM3_STM32/nvm.h +++ b/Target/Source/ARMCM3_STM32/nvm.h @@ -51,9 +51,9 @@ blt_bool NvmDone(void); * Macro definitions ****************************************************************************************/ /* return codes for hook function NvmWrite/Erase */ -#define BTL_NVM_ERROR (0x00) /* return code for success */ -#define BTL_NVM_OKAY (0x01) /* return code for error */ -#define BTL_NVM_NOT_IN_RANGE (0x02) /* return code for not in range */ +#define BLT_NVM_ERROR (0x00) /* return code for success */ +#define BLT_NVM_OKAY (0x01) /* return code for error */ +#define BLT_NVM_NOT_IN_RANGE (0x02) /* return code for not in range */ #endif /* NVM_H */