From 8b6ad41411cc41468287d46a67a9d07e4e460d3d Mon Sep 17 00:00:00 2001 From: penguin Date: Wed, 16 Dec 2020 15:45:03 -0600 Subject: [PATCH] updating with more commands --- .../index/driver_init.c.D43AF3E174846C58.idx | Bin 1904 -> 1904 bytes .../index/hal_atomic.h.066AAD04FA8F0A31.idx | Bin 796 -> 802 bytes .../index/hpl_cmcc.h.F300C1A864DEA5F0.idx | Bin 3568 -> 3602 bytes .../hpl_sercom_config.h.DB1E276A55EE99A3.idx | Bin 1170 -> 1170 bytes .../index/hpl_spi.h.297BABF6466FF14F.idx | Bin 2666 -> 2652 bytes .../index/pdebug.h.4C4C1357662BA1EC.idx | Bin 548 -> 554 bytes .../startup_same54.c.FA8EEC5C0935C5CC.idx | Bin 14186 -> 14192 bytes .../index/stdarg.h.BC7E480AEDEEE302.idx | Bin 228 -> 394 bytes .../system_same54.c.FA3E2D5F8ABF1AF1.idx | Bin 434 -> 544 bytes build/gdb.txt | 1028 +++++++++++++++++ shared/drivers/.#sd_mmc.c | 1 - shared/drivers/sd_mmc.c | 342 +++++- shared/drivers/sd_mmc.h | 46 +- 13 files changed, 1351 insertions(+), 66 deletions(-) delete mode 120000 shared/drivers/.#sd_mmc.c diff --git a/build/.cache/clangd/index/driver_init.c.D43AF3E174846C58.idx b/build/.cache/clangd/index/driver_init.c.D43AF3E174846C58.idx index 41dc6a7760615aca1472a24ab4b05d99281b2080..010b99c0ff521b893f04ec32210b2e8dee34df40 100644 GIT binary patch delta 168 zcmeys_knN28z#wATV~b3&rg_n1Y9IsWOxMJB;0_cpSa)TS4{GgC79(l2Qt?(N|#wT z?=?8IW(rW9xrn(0kAS^|Jy4yaxTEysb1dJ)mvQcDUAw14j*&+|L{`LX`H|Ev&ZnlE zCNr`N%dK!RG7b9~RRWX?Rth#-kuvd<&c6;;kWz6G>B)at?I(M)$@2xS`I{jue;6n% QCN3sDIg@R|WD)il0HfYAO#lD@ delta 211 zcmeys_knN28>Y$Z%(5P$jK{Nu?mhX!$Ri*oE+#Fxw8O)&fuRz}jggB{mHLv{w)7lR zA&@I=Asr<1H+IoCmM2G;7rYLL< zRAeq)JgXazNumWJSzYxEPs+{fsIBa)XtE%_d8*+4G;g z@ZOShj@S&45^)jf$>D7BlUv#PrN6nn)jGcV#Uh}o+9KLOQ;j8zfu@>@n@Ud>VUGa- D2qQcJ diff --git a/build/.cache/clangd/index/hal_atomic.h.066AAD04FA8F0A31.idx b/build/.cache/clangd/index/hal_atomic.h.066AAD04FA8F0A31.idx index b41037f7782e1aae0713fa1528aeace288149afd..4eb72b01a25788a7c7f309dc11418a982512463d 100644 GIT binary patch delta 618 zcmV-w0+s!o2BHRkQb|Te8Up|TLu5&KZDn*}1ONa44FCWDb98cPxB&nFvIGDCc%0Rf zL2uMB5QTHjub2ae7AUrFyRqyNbJEQP)Nv}`y?B{aSe_sk+U8IU7{F&%5rHIXnZ{An{{Xlce(E) zCxL*HuzoZyn-U~KYHfNv4weyO@DITF2E%Almyr7yz@r@~G&-mqSqHi(=_!+~hTQj- zZTCfczk*G%BM0|7+sDZcQUnWwWtz6Fza&L9ALR$@vzi=F`N}mQ%$eZmZBs&Vrg!^; z(qgh=x()w-4J8WCL)yUimRvi7lF7o`q|$RmBb>pF@BWPa6uZxu^f}DvU1rwL4r-=B z{q>fa<(@HR4)Ecx4ckk>`-fg#B2R*h4avBbHu`!b^GvL(S3lqGhNv4OEwv{F-y13HopFP*bsWSbAss;Q~Z7@}*f$$jX0o<(d2M2d0000$t}&eDx%k%%015yA4mAZe8VzX$X&L|t z1P28(0ul@X4FO1TwcGx$Fc=H~2mk;MD+MbW4P6CY8UP6d2L%BV3;_)Ro!f_1xN&O| z3jh$4DFP%B4n7G!8x3#?a2oO^5J5tCj5rxyCA;66&K83Ul7YHzJFYW zhcR+Pozc13LKaP1!shig`*IlmVE6dJcQ_+x`h?#S2Nug}m{_fljbz_-;?ty)Vb1TW zXXktmt=``_^~S_z>$z_qr?3khJd_~pd;40vPT*Php9g=fQ9B;IuZWkUSk0p9_LP7* zFJu2JMEZpJTz|N~exb|5QV;1L_a(@=kxfucVdn?m+`fFIS{`it}_}j(@cb(Vk8TvMHN#gPL_0*KlrsyI(Wy zuHpRB*f&+7-m88|I879NcbtEhgwoZc`JvoXUo#X}<|cIjBhg`<;hd*Ce_ZEb-~#eM zfH#vhQ;LC;g`Jg2kcW|%QP-nz>+OH*4J3FNI3Ow*cw<>(Axap*O6J~f58Y9iEyT^h sKUtqiMG#_60cU|U&>S{4W`W5mOv}ajpt?bJeCCg=P>$geW#nT30H~b%XaE2J diff --git a/build/.cache/clangd/index/hpl_cmcc.h.F300C1A864DEA5F0.idx b/build/.cache/clangd/index/hpl_cmcc.h.F300C1A864DEA5F0.idx index 45cd691b8037a368376be40e7a70f064d66ac11b..cc3ca2b061e5ee10f7d1332511ca47b7ad554c09 100644 GIT binary patch delta 1455 zcmXw(2~bl<9EaaNLR>TfM1qMVgd^g?RShafK@mi`tW%wF+H<&*GO}o9WV(`EGZZX)u&nW@{K5S?hgNxkZe!6n`(um^%e!8D!ukHW z`JFDCI~1~%_+szECEQYyi4GN;yonBU-bEYQc#4smU-itiG%ZaoklMsFf9e&JYX5|Y zV8MmbHrCa@U56#YkTX*L1beXNMHo}}^T2A2ou{<^N={43iFv0X_HNGilK5_VnjS%` z7)!rnwqV*LOjaj(*RSl^etj$Fam6Oz&FCIL6C92#cKN`iIS<26!n`S@*p5 zoYhW_rF0l7vkYprgWU}1#}h_|^3?LX%>4TH=l2Vz25n~dT5>;s`{Pi6b<*Clm@skv zsmYR=V(gni)L7f0tG7UT`$p216{Wx(= zW0F?nz0-qdMiPaQvP5Bbw79;Q#;fkE8%tPe4kWTn<>7mB+bYrAtWNI{3oBMd>4fa~ zn%_hUxwA*a*(2NS&!70Aw)yrtVQ+}ZE4!@NsIGnW4VcCC7F!R~@QFtacugleTsiQ0 z^nCXq@qBxuUY@}E3WO>{!&e!4n>ELh}TH6|FsDaZx{;WeVL5oKX>0L}px zqCqmGFXH3IBwrd&j6yNW#0CKz1WZ+;!^hJ|TpCY?LK&)$rJ^tu)mJ4nKHf(10lRP` zbq;aaD6A&TPXK=UZc_O8E_JSu=LtQRViEu)U@74(XF>i}fB|Rv?t5YBLR|`CO*E1M zC4^Fm+YbR?jn&*)!M_ z1+gQjU>MBC@&U{TY=R*fF*N!3Lh?av6?$Yi)$hGGw08{`v z)(T)Npc4s)si*QM4Jzsk17^A@hy&sGqZ<9FDJDiW#HcAj8Pc`=@LWhdj|e~!U}Gf! emZ*9eF|_zq{qPHk;p>C=694b_<@5gmLH+~Qy+maI delta 1419 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 WIg{N6Ljp8ClOhL*0X4I$2eASQ1ozDV diff --git a/build/.cache/clangd/index/pdebug.h.4C4C1357662BA1EC.idx b/build/.cache/clangd/index/pdebug.h.4C4C1357662BA1EC.idx index 5665badea56706abece1d4bc5fae4e3627b1ff93..e996821c95ad59647261d78cb9755176a8fe26d8 100644 GIT binary patch literal 554 zcmWIYbaPW;VqkDi@vO*AElFfyU|`?{;^LB`%&$ON9w=8aXYGXDd4~;nT)%2c8JV;u zFYG^AJS~s)7h{voMLup@p1@N=PwsoG`$dbt2ojl~@aUemoYSMc;;I)pT_Gv+Cryvp zRjh2j{J85@_Q_9c7XJY%-iQjw`s&T_o!Eq-vt?xvK2SkQXQz0FUX)UG@! z;RvgKGgXsu&$6VVO#XU#=j#c&FRngWus%8af9b93c~dtTS-wf?+Q58y@u7^`(gQN> zos<7$CmFd+__=pWcF&2gQ*KHfFCO!NUi$1t<$L{S%i`r(`R~U7#!@2cyszMz#&vTQ~dz va=AIU`51~)a}t3TG87jj7b}Ap93TP$xM2(i2CjvlxDR`3&9G+T;AQ{-{2H{y literal 548 zcmWIYbaRtoVqkDi@vO*AElFfyU|`?{;^LB`%=bY0A|nGs#hkhQXR{6)2(*0FuzE5< z-n|~+V$n!ft*LPyqo8V8A zmRg$^6<0;ZR2xLvu}XbSxNx24`j^tFd@u69-A+o@xs=@U+0TYyT9HO?&h4^uKmH_{ zf8u{*HKViqIp6QdZO`7cytVrwchu&J=F$~Qa@+#q?=UaFH+d~%lH%8ym(3%@Octsw zciwO-dA$$k15?q--qk<;OYIWPc3iKCmZ@T56SuTb1nXQm9bbxE$@^4 z(UcB_&(*TmB_@8IVkvdRaG|jHlvN9+F%(zkCZz%W?QwQf+3mpj{yYqPKpqHiva_&r zGjOu7GBI$oF>*3i8y}Kexj{6Shk*y8fPs^fm6Hdkf`yTRpB<=Th9Yko@AEg$c)%eF zHiMOgl^>{rnHge6QEFOoCQt%q8zU#!me|9Ko;{tgg_n_slT(;e9A*Qbxj1<^c=%wp0A)d@f8tW=lx*d=3zTK#U=;eo$hIMS>xO?oE;k1^A45@UP9n%9 h#YM@*${+>@h=2et7z60pg`c<&duq+FX5!#t005OnwU7V+ diff --git a/build/.cache/clangd/index/startup_same54.c.FA8EEC5C0935C5CC.idx b/build/.cache/clangd/index/startup_same54.c.FA8EEC5C0935C5CC.idx index adb6d3fa6ed8d2309d594e3477461eb290ac7716..bd09f9a1fbd9693d6d2461d01b8735425d14d667 100644 GIT binary patch literal 14192 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 T?2DsE`#GP(Z#DUgkKz9Z;toPZ literal 14186 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 diff --git a/build/.cache/clangd/index/stdarg.h.BC7E480AEDEEE302.idx b/build/.cache/clangd/index/stdarg.h.BC7E480AEDEEE302.idx index 22efa819ad1226b21926273b451bf534f86c9329..8b20e9acfecf3f536e51eb7c76f84613aac152f0 100644 GIT binary patch delta 193 zcmaFD*u~5i{LH%I{1_nO(%o!XRf_$?!*X+_x`UB+3amWes zKeLeV6t2Gm?*&5~ zcBw&r`n;B|3$p`k^lzqYvo@1|trEF%|Gkp(t5IK+*qBbvp03WXtaYQxYl+TY#U*@- za>-8Np#|3s61g`Vp7Q(S$%)SvH2ce}ah9IG8*DPINZ2XI5*Aatf@ymKv2C$i2C@NU+J7$rsDA)1H zCz3SNeslgf@MF@&*UCC(^LMB=?D+BXlbz?emzg$B>$j)!FH-H!)=c$jyeju}U2u=v zJ@&b=8~Z*@JZ$``sKfT^#VhAt-U?El?Q`u!=C{%izWn^KU+*nG-AZdNQY-!M@N3z% zP9MA2_^X~gjXf3Y7gTQR7gy#cr2#{V@xngQmw$H}^DwY8FmUOz>hkkwuxju#aI!En zGxBjV@-VXHSnLvE`m&mrffcAil~YxMM@>LY9;kwWfrXa?sKWcW{rb~hQzLj7*nldm zSgoXZG+8yJz-BOk%_vGuEA~LLjgbp%70hU6E{M5Y28;#*JY2SnwgOyhKAg3g_3s%Y v50@%~DhJF8phl4SMX5Q7K;sySi;|1QLFRHr#Q$gs`172Rk(+@VBm)5ej8(r5 literal 434 zcmWIYbaPw9$iU#7;#rZKT9U}Zz`(!@#Kk2=nX7?xG*GT$&f31+T!$P4T)zizGwEfv zo3%wyajw9c>1W?%xP2G=E_mX;bh4E0(WD3W4nH->3Ehy^!>PNzC%n9l=f{Z`S5Aaa z<^Qpa_4(;nN7KICJ->Gvr+AdLm(SF%CCs}g9284d`aZ3;RT0{@rQJ!@$bGz@f{k%g?33s=?2|$->CUz{AeS#mJUpu}g&M z%W7T*W}pgHPE`pmH32nwpb7>CCT=#M3h(3g>rZ=4jo@Jb3UOGmT1jzfvT8~pnNgIQ zR_uXf8zUFkDwxsCTwrr~I1CsK1b8@X8Epl))_gc?Gwa_oMjj4T22~E26+n$3^NUh* g5`o4s6c;5Ii-XMNh=~8u67c6aBO@mRCrAbY0QrcA(*OVf diff --git a/build/gdb.txt b/build/gdb.txt index 93e70dd..a2a24c7 100644 --- a/build/gdb.txt +++ b/build/gdb.txt @@ -518,3 +518,1031 @@ Note: automatically using hardware breakpoints for read-only addresses. Breakpoint 1, main () at ../main.c:7 7 atmel_start_init(); +─── Assembly ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + 0x000007f6 main+10 ldr r3, [pc, #20] ; (0x80c ) + 0x000007f8 main+12 ldr r0, [pc, #20] ; (0x810 ) + 0x000007fa main+14 blx r3 + 0x000007fc main+16 ldr r3, [pc, #20] ; (0x814 ) + 0x000007fe main+18 blx r3 + 0x00000800 main+20 b.n 0x800  + 0x00000802 main+22 nop + 0x00000804 main+24 lsrs r1, r0, #23 + 0x00000806 main+26 movs r0, r0 + 0x00000808 main+28 lsrs r1, r5, #24 +─── Breakpoints ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Expressions ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── History ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Memory ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Registers ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + r0 0x00000000 r1 0x0000000a r2 0x000000f1 r3 0x000005b1 r4 0x1ffffffd r5 0xfba7dfb7 + r6 0xffffffef r7 0xff7f6ffd r8 0xf7e2d6ef r9 0xffffff7d r10 0xffffefcf r11 0xaf9faffe + r12 0x0000000a sp 0x200100d0 lr 0x00000fdf pc 0x00000800 xpsr 0x21000000 fpscr 0x00000000 + msp 0x200100d0 psp 0xfff3df7c primask 0x00 basepri 0x00 faultmask 0x00 control 0x00 +─── Source ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +  5 { +  6 /* Initializes MCU, drivers and middleware */ +  7 atmel_start_init(); +  8 pdebug_init(); +  9 + 10 printf("Hi\n"); + 11 + 12 sd_mmc_init(); + 13 /* Replace with your application code */ + 14 while (1) { + 15 } + 16 } +~ +~ +~ +~ +~ +~ +~ +~ +─── Stack ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[0] from 0x00000800 in main+20 at ../main.c:15 +─── Threads ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[1] id 0 from 0x00000800 in main+20 at ../main.c:15 +─── Variables ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +main () at ../main.c:15 +15 } +Breakpoint 1 at 0x7ec: file ../main.c, line 7. +Loading section .text, size 0x1c18 lma 0x0 +Loading section .relocate, size 0x64 lma 0x1c18 +Start address 0x0, load size 7292 +Transfer rate: 53 KB/sec, 810 bytes/write. +─── Output/messages ───────────────────────────────────────────────────────────────────────────────────────────────────────────────── +Note: automatically using hardware breakpoints for read-only addresses. +─── Assembly ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +~ +~ +~ +~ +~ +!0x000007ec main+0 push {r3, lr} + 0x000007ee main+2 ldr r3, [pc, #20] ; (0x804 ) + 0x000007f0 main+4 blx r3 + 0x000007f2 main+6 ldr r3, [pc, #20] ; (0x808 ) + 0x000007f4 main+8 blx r3 +─── Breakpoints ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[1] break at 0x000007ec in ../main.c:7 for main hit 1 time +─── Expressions ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── History ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Memory ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Registers ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + r0 0x20000064 r1 0x00000000 r2 0x00f00000 r3 0x000007ed r4 0x1ffffffd r5 0xfba7dfb7 + r6 0xffffffef r7 0xff7f6ffd r8 0xf7e2d6ef r9 0xffffff7d r10 0xffffefcf r11 0xaf9faffe + r12 0x0000000a sp 0x200100d8 lr 0x000007bd pc 0x000007ec xpsr 0x61000000 fpscr 0x00000000 + msp 0x200100d8 psp 0xfff3df7c primask 0x00 basepri 0x00 faultmask 0x00 control 0x00 +─── Source ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +~ +~ +~ +~ +  1 #include +  2 #include "pdebug.h" +  3 #include "sd_mmc.h" +  4 int main(void) +  5 { +  6 /* Initializes MCU, drivers and middleware */ +! 7 atmel_start_init(); +  8 pdebug_init(); +  9 + 10 printf("Hi\n"); + 11 + 12 sd_mmc_init(); + 13 /* Replace with your application code */ + 14 while (1) { + 15 } + 16 } +─── Stack ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[0] from 0x000007ec in main+0 at ../main.c:7 +─── Threads ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[1] id -1 from 0x000007ec in main+0 at ../main.c:7 +─── Variables ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + +Breakpoint 1, main () at ../main.c:7 +7 atmel_start_init(); +─── Assembly ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + 0x000007f6 main+10 ldr r3, [pc, #20] ; (0x80c ) + 0x000007f8 main+12 ldr r0, [pc, #20] ; (0x810 ) + 0x000007fa main+14 blx r3 + 0x000007fc main+16 ldr r3, [pc, #20] ; (0x814 ) + 0x000007fe main+18 blx r3 + 0x00000800 main+20 b.n 0x800  + 0x00000802 main+22 nop + 0x00000804 main+24 lsrs r1, r0, #23 + 0x00000806 main+26 movs r0, r0 + 0x00000808 main+28 lsrs r1, r5, #24 +─── Breakpoints ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Expressions ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── History ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Memory ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Registers ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + r0 0x00000000 r1 0x0000000a r2 0x000000f1 r3 0x000005b1 r4 0x1ffffffd r5 0xfba7dfb7 + r6 0xffffffef r7 0xff7f6ffd r8 0xf7e2d6ef r9 0xffffff7d r10 0xffffefcf r11 0xaf9faffe + r12 0x0000000a sp 0x200100d0 lr 0x00000fed pc 0x00000800 xpsr 0x21000000 fpscr 0x00000000 + msp 0x200100d0 psp 0xfff3df7c primask 0x00 basepri 0x00 faultmask 0x00 control 0x00 +─── Source ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +  5 { +  6 /* Initializes MCU, drivers and middleware */ +  7 atmel_start_init(); +  8 pdebug_init(); +  9 + 10 printf("Hi\n"); + 11 + 12 sd_mmc_init(); + 13 /* Replace with your application code */ + 14 while (1) { + 15 } + 16 } +~ +~ +~ +~ +~ +~ +~ +~ +─── Stack ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[0] from 0x00000800 in main+20 at ../main.c:15 +─── Threads ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[1] id 0 from 0x00000800 in main+20 at ../main.c:15 +─── Variables ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +main () at ../main.c:15 +15 } +Breakpoint 1 at 0x7ec: file ../main.c, line 7. +Loading section .text, size 0x1c18 lma 0x0 +Loading section .relocate, size 0x64 lma 0x1c18 +Start address 0x0, load size 7292 +Transfer rate: 53 KB/sec, 810 bytes/write. +─── Output/messages ───────────────────────────────────────────────────────────────────────────────────────────────────────────────── +Note: automatically using hardware breakpoints for read-only addresses. +─── Assembly ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +~ +~ +~ +~ +~ +!0x000007ec main+0 push {r3, lr} + 0x000007ee main+2 ldr r3, [pc, #20] ; (0x804 ) + 0x000007f0 main+4 blx r3 + 0x000007f2 main+6 ldr r3, [pc, #20] ; (0x808 ) + 0x000007f4 main+8 blx r3 +─── Breakpoints ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[1] break at 0x000007ec in ../main.c:7 for main hit 1 time +─── Expressions ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── History ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Memory ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Registers ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + r0 0x20000064 r1 0x00000000 r2 0x00f00000 r3 0x000007ed r4 0x1ffffffd r5 0xfba7dfb7 + r6 0xffffffef r7 0xff7f6ffd r8 0xf7e2d6ef r9 0xffffff7d r10 0xffffefcf r11 0xaf9faffe + r12 0x0000000a sp 0x200100d8 lr 0x000007bd pc 0x000007ec xpsr 0x61000000 fpscr 0x00000000 + msp 0x200100d8 psp 0xfff3df7c primask 0x00 basepri 0x00 faultmask 0x00 control 0x00 +─── Source ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +~ +~ +~ +~ +  1 #include +  2 #include "pdebug.h" +  3 #include "sd_mmc.h" +  4 int main(void) +  5 { +  6 /* Initializes MCU, drivers and middleware */ +! 7 atmel_start_init(); +  8 pdebug_init(); +  9 + 10 printf("Hi\n"); + 11 + 12 sd_mmc_init(); + 13 /* Replace with your application code */ + 14 while (1) { + 15 } + 16 } +─── Stack ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[0] from 0x000007ec in main+0 at ../main.c:7 +─── Threads ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[1] id -1 from 0x000007ec in main+0 at ../main.c:7 +─── Variables ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + +Breakpoint 1, main () at ../main.c:7 +7 atmel_start_init(); +─── Assembly ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + 0x000007f6 main+10 ldr r3, [pc, #20] ; (0x80c ) + 0x000007f8 main+12 ldr r0, [pc, #20] ; (0x810 ) + 0x000007fa main+14 blx r3 + 0x000007fc main+16 ldr r3, [pc, #20] ; (0x814 ) + 0x000007fe main+18 blx r3 + 0x00000800 main+20 b.n 0x800  + 0x00000802 main+22 nop + 0x00000804 main+24 lsrs r1, r0, #23 + 0x00000806 main+26 movs r0, r0 + 0x00000808 main+28 lsrs r1, r5, #24 +─── Breakpoints ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Expressions ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── History ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Memory ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Registers ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + r0 0x00000000 r1 0x0000000a r2 0x000000f1 r3 0x000005b1 r4 0x1ffffffd r5 0xfba7dfb7 + r6 0xffffffef r7 0xff7f6ffd r8 0xf7e2d6ef r9 0xffffff7d r10 0xffffefcf r11 0xaf9faffe + r12 0x0000000a sp 0x200100d0 lr 0x00000fed pc 0x00000800 xpsr 0x21000000 fpscr 0x00000000 + msp 0x200100d0 psp 0xfff3df7c primask 0x00 basepri 0x00 faultmask 0x00 control 0x00 +─── Source ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +  5 { +  6 /* Initializes MCU, drivers and middleware */ +  7 atmel_start_init(); +  8 pdebug_init(); +  9 + 10 printf("Hi\n"); + 11 + 12 sd_mmc_init(); + 13 /* Replace with your application code */ + 14 while (1) { + 15 } + 16 } +~ +~ +~ +~ +~ +~ +~ +~ +─── Stack ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[0] from 0x00000800 in main+20 at ../main.c:15 +─── Threads ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[1] id -1 from 0x00000800 in main+20 at ../main.c:15 +─── Variables ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +main () at ../main.c:15 +15 } +A program is being debugged already. Kill it? (y or n) [answered Y; input not from terminal] +─── Assembly ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +~ +~ +~ +~ + 0x00000596 hri_oscctrl_get_DPLLSTATUS_LOCK_bit+0 ldr r3, [pc, #16] ; (0x5a8 <_oscctrl_init_referenced_generators+52>) + 0x00000598 hri_oscctrl_get_DPLLSTATUS_LOCK_bit+2 ldr r2, [r3, #64] ; 0x40 +~ +~ +~ +~ +─── Breakpoints ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Expressions ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── History ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Memory ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Registers ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + r0 0x00000000 r1 0x00000000 r2 0x00000000 r3 0x40001000 r4 0x1ffffffd r5 0xfba7dfb7 + r6 0xffffffef r7 0xff7f6ffd r8 0xf7e2d6ef r9 0xffffff7d r10 0xffffefcf r11 0xaf9faffe + r12 0x0000000a sp 0x200100c0 lr 0x0000050f pc 0x00000598 xpsr 0x41000000 fpscr 0x00000000 + msp 0x200100c0 psp 0xfff3df7c primask 0x00 basepri 0x00 faultmask 0x00 control 0x00 +─── Source ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + 908 } + 909 + 910 static inline hri_oscctrl_dpllsyncbusy_reg_t hri_oscctrl_read_DPLLSYNCBUSY_reg(const void *const hw, + 911 uint8_t submodule_index) + 912 { + 913 return ((Oscctrl *)hw)->Dpll[submodule_index].DPLLSYNCBUSY.reg; + 914 } + 915 + 916 static inline bool hri_oscctrl_get_DPLLSTATUS_LOCK_bit(const void *const hw, uint8_t submodule_index) + 917 { + 918 return (((Oscctrl *)hw)->Dpll[submodule_index].DPLLSTATUS.reg & OSCCTRL_DPLLSTATUS_LOCK) + 919 >> OSCCTRL_DPLLSTATUS_LOCK_Pos; + 920 } + 921 + 922 static inline bool hri_oscctrl_get_DPLLSTATUS_CLKRDY_bit(const void *const hw, uint8_t submodule_index) + 923 { + 924 return (((Oscctrl *)hw)->Dpll[submodule_index].DPLLSTATUS.reg & OSCCTRL_DPLLSTATUS_CLKRDY) + 925 >> OSCCTRL_DPLLSTATUS_CLKRDY_Pos; + 926 } + 927 +─── Stack ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[0] from 0x00000598 in hri_oscctrl_get_DPLLSTATUS_LOCK_bit+2 at ../hri/hri_oscctrl_e54.h:918 +[1] from 0x00000598 in _oscctrl_init_referenced_generators+36 at ../hpl/oscctrl/hpl_oscctrl.c:204 +[2] from 0x0000050e in _init_chip+30 at ../hpl/core/hpl_init.c:63 +[3] from 0x000009ea in init_mcu+4 at ../hal/include/hal_init.h:58 +[4] from 0x000009ea in system_init+6 at ../driver_init.c:104 +[5] from 0x00000dc4 in atmel_start_init+4 at ../atmel_start.c:8 +[6] from 0x000007f2 in main+6 at ../main.c:7 +─── Threads ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[1] id 0 from 0x00000598 in hri_oscctrl_get_DPLLSTATUS_LOCK_bit+2 at ../hri/hri_oscctrl_e54.h:918 +─── Variables ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +arg submodule_index = 0 '\000', hw = 0x40001000 +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +hri_oscctrl_get_DPLLSTATUS_LOCK_bit (submodule_index=0 '\000', hw=0x40001000) at ../hri/hri_oscctrl_e54.h:918 +918 return (((Oscctrl *)hw)->Dpll[submodule_index].DPLLSTATUS.reg & OSCCTRL_DPLLSTATUS_LOCK) +Breakpoint 1 at 0x7ec: file ../main.c, line 7. +Loading section .text, size 0x1c08 lma 0x0 +Loading section .relocate, size 0x64 lma 0x1c08 +Start address 0x0, load size 7276 +Transfer rate: 52 KB/sec, 808 bytes/write. +─── Output/messages ───────────────────────────────────────────────────────────────────────────────────────────────────────────────── +Note: automatically using hardware breakpoints for read-only addresses. +─── Assembly ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +~ +~ +~ +~ +~ +!0x000007ec main+0 push {r3, lr} + 0x000007ee main+2 ldr r3, [pc, #20] ; (0x804 ) + 0x000007f0 main+4 blx r3 + 0x000007f2 main+6 ldr r3, [pc, #20] ; (0x808 ) + 0x000007f4 main+8 blx r3 +─── Breakpoints ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[1] break at 0x000007ec in ../main.c:7 for main hit 1 time +─── Expressions ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── History ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Memory ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Registers ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + r0 0x20000064 r1 0x00000000 r2 0x00f00000 r3 0x000007ed r4 0x1ffffffd r5 0xfba7dfb7 + r6 0xffffffef r7 0xff7f6ffd r8 0xf7e2d6ef r9 0xffffff7d r10 0xffffefcf r11 0xaf9faffe + r12 0x0000000a sp 0x200100d8 lr 0x000007bd pc 0x000007ec xpsr 0x61000000 fpscr 0x00000000 + msp 0x200100d8 psp 0xfff3df7c primask 0x00 basepri 0x00 faultmask 0x00 control 0x00 +─── Source ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +~ +~ +~ +~ +  1 #include +  2 #include "pdebug.h" +  3 #include "sd_mmc.h" +  4 int main(void) +  5 { +  6 /* Initializes MCU, drivers and middleware */ +! 7 atmel_start_init(); +  8 pdebug_init(); +  9 + 10 printf("Hi\n"); + 11 + 12 sd_mmc_init(); + 13 /* Replace with your application code */ + 14 while (1) { + 15 } + 16 } +─── Stack ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[0] from 0x000007ec in main+0 at ../main.c:7 +─── Threads ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[1] id -1 from 0x000007ec in main+0 at ../main.c:7 +─── Variables ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + +Breakpoint 1, main () at ../main.c:7 +7 atmel_start_init(); +─── Assembly ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + 0x000007f6 main+10 ldr r3, [pc, #20] ; (0x80c ) + 0x000007f8 main+12 ldr r0, [pc, #20] ; (0x810 ) + 0x000007fa main+14 blx r3 + 0x000007fc main+16 ldr r3, [pc, #20] ; (0x814 ) + 0x000007fe main+18 blx r3 + 0x00000800 main+20 b.n 0x800  + 0x00000802 main+22 nop + 0x00000804 main+24 lsrs r1, r0, #23 + 0x00000806 main+26 movs r0, r0 + 0x00000808 main+28 lsrs r1, r5, #24 +─── Breakpoints ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Expressions ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── History ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Memory ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Registers ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + r0 0x00000000 r1 0x00000001 r2 0x41008000 r3 0x10000000 r4 0x1ffffffd r5 0xfba7dfb7 + r6 0xffffffef r7 0xff7f6ffd r8 0xf7e2d6ef r9 0xffffff7d r10 0xffffefcf r11 0xaf9faffe + r12 0x0000000a sp 0x200100d0 lr 0x00000fe7 pc 0x00000800 xpsr 0x61000000 fpscr 0x00000000 + msp 0x200100d0 psp 0xfff3df7c primask 0x00 basepri 0x00 faultmask 0x00 control 0x00 +─── Source ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +  5 { +  6 /* Initializes MCU, drivers and middleware */ +  7 atmel_start_init(); +  8 pdebug_init(); +  9 + 10 printf("Hi\n"); + 11 + 12 sd_mmc_init(); + 13 /* Replace with your application code */ + 14 while (1) { + 15 } + 16 } +~ +~ +~ +~ +~ +~ +~ +~ +─── Stack ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[0] from 0x00000800 in main+20 at ../main.c:15 +─── Threads ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[1] id -1 from 0x00000800 in main+20 at ../main.c:15 +─── Variables ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +main () at ../main.c:15 +15 } +A program is being debugged already. Kill it? (y or n) [answered Y; input not from terminal] +─── Assembly ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +~ +~ +~ +~ + 0x00000596 hri_oscctrl_get_DPLLSTATUS_LOCK_bit+0 ldr r3, [pc, #16] ; (0x5a8 <_oscctrl_init_referenced_generators+52>) + 0x00000598 hri_oscctrl_get_DPLLSTATUS_LOCK_bit+2 ldr r2, [r3, #64] ; 0x40 +~ +~ +~ +~ +─── Breakpoints ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Expressions ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── History ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Memory ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Registers ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + r0 0x00000000 r1 0x00000000 r2 0x00000000 r3 0x40001000 r4 0x1ffffffd r5 0xfba7dfb7 + r6 0xffffffef r7 0xff7f6ffd r8 0xf7e2d6ef r9 0xffffff7d r10 0xffffefcf r11 0xaf9faffe + r12 0x0000000a sp 0x200100c0 lr 0x0000050f pc 0x00000598 xpsr 0x41000000 fpscr 0x00000000 + msp 0x200100c0 psp 0xfff3df7c primask 0x00 basepri 0x00 faultmask 0x00 control 0x00 +─── Source ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + 908 } + 909 + 910 static inline hri_oscctrl_dpllsyncbusy_reg_t hri_oscctrl_read_DPLLSYNCBUSY_reg(const void *const hw, + 911 uint8_t submodule_index) + 912 { + 913 return ((Oscctrl *)hw)->Dpll[submodule_index].DPLLSYNCBUSY.reg; + 914 } + 915 + 916 static inline bool hri_oscctrl_get_DPLLSTATUS_LOCK_bit(const void *const hw, uint8_t submodule_index) + 917 { + 918 return (((Oscctrl *)hw)->Dpll[submodule_index].DPLLSTATUS.reg & OSCCTRL_DPLLSTATUS_LOCK) + 919 >> OSCCTRL_DPLLSTATUS_LOCK_Pos; + 920 } + 921 + 922 static inline bool hri_oscctrl_get_DPLLSTATUS_CLKRDY_bit(const void *const hw, uint8_t submodule_index) + 923 { + 924 return (((Oscctrl *)hw)->Dpll[submodule_index].DPLLSTATUS.reg & OSCCTRL_DPLLSTATUS_CLKRDY) + 925 >> OSCCTRL_DPLLSTATUS_CLKRDY_Pos; + 926 } + 927 +─── Stack ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[0] from 0x00000598 in hri_oscctrl_get_DPLLSTATUS_LOCK_bit+2 at ../hri/hri_oscctrl_e54.h:918 +[1] from 0x00000598 in _oscctrl_init_referenced_generators+36 at ../hpl/oscctrl/hpl_oscctrl.c:204 +[2] from 0x0000050e in _init_chip+30 at ../hpl/core/hpl_init.c:63 +[3] from 0x000009ea in init_mcu+4 at ../hal/include/hal_init.h:58 +[4] from 0x000009ea in system_init+6 at ../driver_init.c:104 +[5] from 0x00000dc4 in atmel_start_init+4 at ../atmel_start.c:8 +[6] from 0x000007f2 in main+6 at ../main.c:7 +─── Threads ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[1] id 0 from 0x00000598 in hri_oscctrl_get_DPLLSTATUS_LOCK_bit+2 at ../hri/hri_oscctrl_e54.h:918 +─── Variables ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +arg submodule_index = 0 '\000', hw = 0x40001000 +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +hri_oscctrl_get_DPLLSTATUS_LOCK_bit (submodule_index=0 '\000', hw=0x40001000) at ../hri/hri_oscctrl_e54.h:918 +918 return (((Oscctrl *)hw)->Dpll[submodule_index].DPLLSTATUS.reg & OSCCTRL_DPLLSTATUS_LOCK) +Breakpoint 1 at 0x7ec: file ../main.c, line 7. +Loading section .text, size 0x1c18 lma 0x0 +Loading section .relocate, size 0x64 lma 0x1c18 +Start address 0x0, load size 7292 +Transfer rate: 54 KB/sec, 810 bytes/write. +─── Output/messages ───────────────────────────────────────────────────────────────────────────────────────────────────────────────── +Note: automatically using hardware breakpoints for read-only addresses. +─── Assembly ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +~ +~ +~ +~ +~ +!0x000007ec main+0 push {r3, lr} + 0x000007ee main+2 ldr r3, [pc, #20] ; (0x804 ) + 0x000007f0 main+4 blx r3 + 0x000007f2 main+6 ldr r3, [pc, #20] ; (0x808 ) + 0x000007f4 main+8 blx r3 +─── Breakpoints ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[1] break at 0x000007ec in ../main.c:7 for main hit 1 time +─── Expressions ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── History ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Memory ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Registers ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + r0 0x20000064 r1 0x00000000 r2 0x00f00000 r3 0x000007ed r4 0x1ffffffd r5 0xfba7dfb7 + r6 0xffffffef r7 0xff7f6ffd r8 0xf7e2d6ef r9 0xffffff7d r10 0xffffefcf r11 0xaf9faffe + r12 0x0000000a sp 0x200100d8 lr 0x000007bd pc 0x000007ec xpsr 0x61000000 fpscr 0x00000000 + msp 0x200100d8 psp 0xfff3df7c primask 0x00 basepri 0x00 faultmask 0x00 control 0x00 +─── Source ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +~ +~ +~ +~ +  1 #include +  2 #include "pdebug.h" +  3 #include "sd_mmc.h" +  4 int main(void) +  5 { +  6 /* Initializes MCU, drivers and middleware */ +! 7 atmel_start_init(); +  8 pdebug_init(); +  9 + 10 printf("Hi\n"); + 11 + 12 sd_mmc_init(); + 13 /* Replace with your application code */ + 14 while (1) { + 15 } + 16 } +─── Stack ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[0] from 0x000007ec in main+0 at ../main.c:7 +─── Threads ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[1] id -1 from 0x000007ec in main+0 at ../main.c:7 +─── Variables ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + +Breakpoint 1, main () at ../main.c:7 +7 atmel_start_init(); +─── Assembly ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + 0x000007f6 main+10 ldr r3, [pc, #20] ; (0x80c ) + 0x000007f8 main+12 ldr r0, [pc, #20] ; (0x810 ) + 0x000007fa main+14 blx r3 + 0x000007fc main+16 ldr r3, [pc, #20] ; (0x814 ) + 0x000007fe main+18 blx r3 + 0x00000800 main+20 b.n 0x800  + 0x00000802 main+22 nop + 0x00000804 main+24 lsrs r1, r0, #23 + 0x00000806 main+26 movs r0, r0 + 0x00000808 main+28 lsrs r1, r5, #24 +─── Breakpoints ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Expressions ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── History ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Memory ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Registers ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + r0 0x00000000 r1 0x0000000a r2 0x000000f1 r3 0x000005b1 r4 0x1ffffffd r5 0xfba7dfb7 + r6 0xffffffef r7 0xff7f6ffd r8 0xf7e2d6ef r9 0xffffff7d r10 0xffffefcf r11 0xaf9faffe + r12 0x0000000a sp 0x200100d0 lr 0x00000fed pc 0x00000800 xpsr 0x21000000 fpscr 0x00000000 + msp 0x200100d0 psp 0xfff3df7c primask 0x00 basepri 0x00 faultmask 0x00 control 0x00 +─── Source ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +  5 { +  6 /* Initializes MCU, drivers and middleware */ +  7 atmel_start_init(); +  8 pdebug_init(); +  9 + 10 printf("Hi\n"); + 11 + 12 sd_mmc_init(); + 13 /* Replace with your application code */ + 14 while (1) { + 15 } + 16 } +~ +~ +~ +~ +~ +~ +~ +~ +─── Stack ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[0] from 0x00000800 in main+20 at ../main.c:15 +─── Threads ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[1] id -1 from 0x00000800 in main+20 at ../main.c:15 +─── Variables ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +main () at ../main.c:15 +15 } +A program is being debugged already. Kill it? (y or n) [answered Y; input not from terminal] +─── Assembly ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + 0x00000592 _oscctrl_init_referenced_generators+30 lsls r0, r3, #30 + 0x00000594 _oscctrl_init_referenced_generators+32 bmi.n 0x590 <_oscctrl_init_referenced_generators+28> + 0x00000596 _oscctrl_init_referenced_generators+34 ldr r3, [pc, #16] ; (0x5a8 <_oscctrl_init_referenced_generators+52>) + 0x00000598 _oscctrl_init_referenced_generators+36 ldr r2, [r3, #64] ; 0x40 + 0x0000059a _oscctrl_init_referenced_generators+38 lsls r1, r2, #31 + 0x0000059c _oscctrl_init_referenced_generators+40 bmi.n 0x5a4 <_oscctrl_init_referenced_generators+48> + 0x0000059e _oscctrl_init_referenced_generators+42 ldr r2, [r3, #64] ; 0x40 + 0x000005a0 _oscctrl_init_referenced_generators+44 lsls r2, r2, #30 + 0x000005a2 _oscctrl_init_referenced_generators+46 bpl.n 0x598 <_oscctrl_init_referenced_generators+36> + 0x000005a4 _oscctrl_init_referenced_generators+48 bx lr +─── Breakpoints ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Expressions ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── History ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Memory ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Registers ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + r0 0x00000000 r1 0x00000000 r2 0x00000000 r3 0x40001000 r4 0x1ffffffd r5 0xfba7dfb7 + r6 0xffffffef r7 0xff7f6ffd r8 0xf7e2d6ef r9 0xffffff7d r10 0xffffefcf r11 0xaf9faffe + r12 0x0000000a sp 0x200100c0 lr 0x0000050f pc 0x0000059c xpsr 0x41000000 fpscr 0x00000000 + msp 0x200100c0 psp 0xfff3df7c primask 0x00 basepri 0x00 faultmask 0x00 control 0x00 +─── Source ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + 908 } + 909 + 910 static inline hri_oscctrl_dpllsyncbusy_reg_t hri_oscctrl_read_DPLLSYNCBUSY_reg(const void *const hw, + 911 uint8_t submodule_index) + 912 { + 913 return ((Oscctrl *)hw)->Dpll[submodule_index].DPLLSYNCBUSY.reg; + 914 } + 915 + 916 static inline bool hri_oscctrl_get_DPLLSTATUS_LOCK_bit(const void *const hw, uint8_t submodule_index) + 917 { + 918 return (((Oscctrl *)hw)->Dpll[submodule_index].DPLLSTATUS.reg & OSCCTRL_DPLLSTATUS_LOCK) + 919 >> OSCCTRL_DPLLSTATUS_LOCK_Pos; + 920 } + 921 + 922 static inline bool hri_oscctrl_get_DPLLSTATUS_CLKRDY_bit(const void *const hw, uint8_t submodule_index) + 923 { + 924 return (((Oscctrl *)hw)->Dpll[submodule_index].DPLLSTATUS.reg & OSCCTRL_DPLLSTATUS_CLKRDY) + 925 >> OSCCTRL_DPLLSTATUS_CLKRDY_Pos; + 926 } + 927 +─── Stack ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[0] from 0x0000059c in _oscctrl_init_referenced_generators+40 at ../hri/hri_oscctrl_e54.h:918 +[1] from 0x0000050e in _init_chip+30 at ../hpl/core/hpl_init.c:63 +[2] from 0x000009ea in init_mcu+4 at ../hal/include/hal_init.h:58 +[3] from 0x000009ea in system_init+6 at ../driver_init.c:104 +[4] from 0x00000dc4 in atmel_start_init+4 at ../atmel_start.c:8 +[5] from 0x000007f2 in main+6 at ../main.c:7 +─── Threads ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[1] id 0 from 0x0000059c in _oscctrl_init_referenced_generators+40 at ../hri/hri_oscctrl_e54.h:918 +─── Variables ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +0x0000059c in _oscctrl_init_referenced_generators () at ../hri/hri_oscctrl_e54.h:918 +918 return (((Oscctrl *)hw)->Dpll[submodule_index].DPLLSTATUS.reg & OSCCTRL_DPLLSTATUS_LOCK) +Breakpoint 1 at 0x7ec: file ../main.c, line 7. +Loading section .text, size 0x1c18 lma 0x0 +Loading section .relocate, size 0x64 lma 0x1c18 +Start address 0x0, load size 7292 +Transfer rate: 53 KB/sec, 810 bytes/write. +─── Output/messages ───────────────────────────────────────────────────────────────────────────────────────────────────────────────── +Note: automatically using hardware breakpoints for read-only addresses. +─── Assembly ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +~ +~ +~ +~ +~ +!0x000007ec main+0 push {r3, lr} + 0x000007ee main+2 ldr r3, [pc, #20] ; (0x804 ) + 0x000007f0 main+4 blx r3 + 0x000007f2 main+6 ldr r3, [pc, #20] ; (0x808 ) + 0x000007f4 main+8 blx r3 +─── Breakpoints ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[1] break at 0x000007ec in ../main.c:7 for main hit 1 time +─── Expressions ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── History ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Memory ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Registers ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + r0 0x20000064 r1 0x00000000 r2 0x00f00000 r3 0x000007ed r4 0x1ffffffd r5 0xfba7dfb7 + r6 0xffffffef r7 0xff7f6ffd r8 0xf7e2d6ef r9 0xffffff7d r10 0xffffefcf r11 0xaf9faffe + r12 0x0000000a sp 0x200100d8 lr 0x000007bd pc 0x000007ec xpsr 0x61000000 fpscr 0x00000000 + msp 0x200100d8 psp 0xfff3df7c primask 0x00 basepri 0x00 faultmask 0x00 control 0x00 +─── Source ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +~ +~ +~ +~ +  1 #include +  2 #include "pdebug.h" +  3 #include "sd_mmc.h" +  4 int main(void) +  5 { +  6 /* Initializes MCU, drivers and middleware */ +! 7 atmel_start_init(); +  8 pdebug_init(); +  9 + 10 printf("Hi\n"); + 11 + 12 sd_mmc_init(); + 13 /* Replace with your application code */ + 14 while (1) { + 15 } + 16 } +─── Stack ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[0] from 0x000007ec in main+0 at ../main.c:7 +─── Threads ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[1] id -1 from 0x000007ec in main+0 at ../main.c:7 +─── Variables ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + +Breakpoint 1, main () at ../main.c:7 +7 atmel_start_init(); +─── Assembly ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + 0x000007f6 main+10 ldr r3, [pc, #20] ; (0x80c ) + 0x000007f8 main+12 ldr r0, [pc, #20] ; (0x810 ) + 0x000007fa main+14 blx r3 + 0x000007fc main+16 ldr r3, [pc, #20] ; (0x814 ) + 0x000007fe main+18 blx r3 + 0x00000800 main+20 b.n 0x800  + 0x00000802 main+22 nop + 0x00000804 main+24 lsrs r1, r0, #23 + 0x00000806 main+26 movs r0, r0 + 0x00000808 main+28 lsrs r1, r5, #24 +─── Breakpoints ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Expressions ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── History ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Memory ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Registers ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + r0 0x00000000 r1 0x0000000a r2 0x000000f1 r3 0x000005b1 r4 0x1ffffffd r5 0xfba7dfb7 + r6 0xffffffef r7 0xff7f6ffd r8 0xf7e2d6ef r9 0xffffff7d r10 0xffffefcf r11 0xaf9faffe + r12 0x0000000a sp 0x200100d0 lr 0x00000fef pc 0x00000800 xpsr 0x21000000 fpscr 0x00000000 + msp 0x200100d0 psp 0xfff3df7c primask 0x00 basepri 0x00 faultmask 0x00 control 0x00 +─── Source ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +  5 { +  6 /* Initializes MCU, drivers and middleware */ +  7 atmel_start_init(); +  8 pdebug_init(); +  9 + 10 printf("Hi\n"); + 11 + 12 sd_mmc_init(); + 13 /* Replace with your application code */ + 14 while (1) { + 15 } + 16 } +~ +~ +~ +~ +~ +~ +~ +~ +─── Stack ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[0] from 0x00000800 in main+20 at ../main.c:15 +─── Threads ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[1] id -1 from 0x00000800 in main+20 at ../main.c:15 +─── Variables ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +main () at ../main.c:15 +15 } +A program is being debugged already. Kill it? (y or n) [answered Y; input not from terminal] +─── Assembly ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + 0x00000596 _oscctrl_init_referenced_generators+34 ldr r3, [pc, #16] ; (0x5a8 <_oscctrl_init_referenced_generators+52>) + 0x00000598 _oscctrl_init_referenced_generators+36 ldr r2, [r3, #64] ; 0x40 + 0x0000059a _oscctrl_init_referenced_generators+38 lsls r1, r2, #31 + 0x0000059c _oscctrl_init_referenced_generators+40 bmi.n 0x5a4 <_oscctrl_init_referenced_generators+48> + 0x0000059e _oscctrl_init_referenced_generators+42 ldr r2, [r3, #64] ; 0x40 + 0x000005a0 _oscctrl_init_referenced_generators+44 lsls r2, r2, #30 + 0x000005a2 _oscctrl_init_referenced_generators+46 bpl.n 0x598 <_oscctrl_init_referenced_generators+36> + 0x000005a4 _oscctrl_init_referenced_generators+48 bx lr + 0x000005a6 _oscctrl_init_referenced_generators+50 nop + 0x000005a8 _oscctrl_init_referenced_generators+52 asrs r0, r0, #32 +─── Breakpoints ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Expressions ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── History ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Memory ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Registers ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + r0 0x00000000 r1 0x00000000 r2 0x00000000 r3 0x40001000 r4 0x1ffffffd r5 0xfba7dfb7 + r6 0xffffffef r7 0xff7f6ffd r8 0xf7e2d6ef r9 0xffffff7d r10 0xffffefcf r11 0xaf9faffe + r12 0x0000000a sp 0x200100c0 lr 0x0000050f pc 0x000005a0 xpsr 0x41000000 fpscr 0x00000000 + msp 0x200100c0 psp 0xfff3df7c primask 0x00 basepri 0x00 faultmask 0x00 control 0x00 +─── Source ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + 914 } + 915 + 916 static inline bool hri_oscctrl_get_DPLLSTATUS_LOCK_bit(const void *const hw, uint8_t submodule_index) + 917 { + 918 return (((Oscctrl *)hw)->Dpll[submodule_index].DPLLSTATUS.reg & OSCCTRL_DPLLSTATUS_LOCK) + 919 >> OSCCTRL_DPLLSTATUS_LOCK_Pos; + 920 } + 921 + 922 static inline bool hri_oscctrl_get_DPLLSTATUS_CLKRDY_bit(const void *const hw, uint8_t submodule_index) + 923 { + 924 return (((Oscctrl *)hw)->Dpll[submodule_index].DPLLSTATUS.reg & OSCCTRL_DPLLSTATUS_CLKRDY) + 925 >> OSCCTRL_DPLLSTATUS_CLKRDY_Pos; + 926 } + 927 + 928 static inline hri_oscctrl_dpllstatus_reg_t hri_oscctrl_get_DPLLSTATUS_reg(const void *const hw, uint8_t submodule_index, + 929 hri_oscctrl_dpllstatus_reg_t mask) + 930 { + 931 uint32_t tmp; + 932 tmp = ((Oscctrl *)hw)->Dpll[submodule_index].DPLLSTATUS.reg; + 933 tmp &= mask; +─── Stack ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[0] from 0x000005a0 in _oscctrl_init_referenced_generators+44 at ../hri/hri_oscctrl_e54.h:924 +[1] from 0x0000050e in _init_chip+30 at ../hpl/core/hpl_init.c:63 +[2] from 0x000009ea in init_mcu+4 at ../hal/include/hal_init.h:58 +[3] from 0x000009ea in system_init+6 at ../driver_init.c:104 +[4] from 0x00000dc4 in atmel_start_init+4 at ../atmel_start.c:8 +[5] from 0x000007f2 in main+6 at ../main.c:7 +─── Threads ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[1] id 0 from 0x000005a0 in _oscctrl_init_referenced_generators+44 at ../hri/hri_oscctrl_e54.h:924 +─── Variables ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +0x000005a0 in _oscctrl_init_referenced_generators () at ../hri/hri_oscctrl_e54.h:924 +924 return (((Oscctrl *)hw)->Dpll[submodule_index].DPLLSTATUS.reg & OSCCTRL_DPLLSTATUS_CLKRDY) +Breakpoint 1 at 0x7ec: file ../main.c, line 7. +Loading section .text, size 0x1c18 lma 0x0 +Loading section .relocate, size 0x64 lma 0x1c18 +Start address 0x0, load size 7292 +Transfer rate: 54 KB/sec, 810 bytes/write. +─── Output/messages ───────────────────────────────────────────────────────────────────────────────────────────────────────────────── +Note: automatically using hardware breakpoints for read-only addresses. +─── Assembly ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +~ +~ +~ +~ +~ +!0x000007ec main+0 push {r3, lr} + 0x000007ee main+2 ldr r3, [pc, #20] ; (0x804 ) + 0x000007f0 main+4 blx r3 + 0x000007f2 main+6 ldr r3, [pc, #20] ; (0x808 ) + 0x000007f4 main+8 blx r3 +─── Breakpoints ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[1] break at 0x000007ec in ../main.c:7 for main hit 1 time +─── Expressions ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── History ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Memory ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Registers ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + r0 0x20000064 r1 0x00000000 r2 0x00f00000 r3 0x000007ed r4 0x1ffffffd r5 0xfba7dfb7 + r6 0xffffffef r7 0xff7f6ffd r8 0xf7e2d6ef r9 0xffffff7d r10 0xffffefcf r11 0xaf9faffe + r12 0x0000000a sp 0x200100d8 lr 0x000007bd pc 0x000007ec xpsr 0x61000000 fpscr 0x00000000 + msp 0x200100d8 psp 0xfff3df7c primask 0x00 basepri 0x00 faultmask 0x00 control 0x00 +─── Source ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +~ +~ +~ +~ +  1 #include +  2 #include "pdebug.h" +  3 #include "sd_mmc.h" +  4 int main(void) +  5 { +  6 /* Initializes MCU, drivers and middleware */ +! 7 atmel_start_init(); +  8 pdebug_init(); +  9 + 10 printf("Hi\n"); + 11 + 12 sd_mmc_init(); + 13 /* Replace with your application code */ + 14 while (1) { + 15 } + 16 } +─── Stack ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[0] from 0x000007ec in main+0 at ../main.c:7 +─── Threads ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[1] id -1 from 0x000007ec in main+0 at ../main.c:7 +─── Variables ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + +Breakpoint 1, main () at ../main.c:7 +7 atmel_start_init(); +─── Assembly ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + 0x000007f6 main+10 ldr r3, [pc, #20] ; (0x80c ) + 0x000007f8 main+12 ldr r0, [pc, #20] ; (0x810 ) + 0x000007fa main+14 blx r3 + 0x000007fc main+16 ldr r3, [pc, #20] ; (0x814 ) + 0x000007fe main+18 blx r3 + 0x00000800 main+20 b.n 0x800  + 0x00000802 main+22 nop + 0x00000804 main+24 lsrs r1, r0, #23 + 0x00000806 main+26 movs r0, r0 + 0x00000808 main+28 lsrs r1, r5, #24 +─── Breakpoints ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Expressions ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── History ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Memory ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Registers ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + r0 0x00000000 r1 0x0000000a r2 0x000000f1 r3 0x000005b1 r4 0x1ffffffd r5 0xfba7dfb7 + r6 0xffffffef r7 0xff7f6ffd r8 0xf7e2d6ef r9 0xffffff7d r10 0xffffefcf r11 0xaf9faffe + r12 0x0000000a sp 0x200100d0 lr 0x00000fef pc 0x00000800 xpsr 0x21000000 fpscr 0x00000000 + msp 0x200100d0 psp 0xfff3df7c primask 0x00 basepri 0x00 faultmask 0x00 control 0x00 +─── Source ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +  5 { +  6 /* Initializes MCU, drivers and middleware */ +  7 atmel_start_init(); +  8 pdebug_init(); +  9 + 10 printf("Hi\n"); + 11 + 12 sd_mmc_init(); + 13 /* Replace with your application code */ + 14 while (1) { + 15 } + 16 } +~ +~ +~ +~ +~ +~ +~ +~ +─── Stack ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[0] from 0x00000800 in main+20 at ../main.c:15 +─── Threads ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[1] id -1 from 0x00000800 in main+20 at ../main.c:15 +─── Variables ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +main () at ../main.c:15 +15 } +A program is being debugged already. Kill it? (y or n) [answered Y; input not from terminal] +─── Assembly ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + 0x00000590 _oscctrl_init_referenced_generators+28 ldr r3, [r2, #60] ; 0x3c + 0x00000592 _oscctrl_init_referenced_generators+30 lsls r0, r3, #30 + 0x00000594 _oscctrl_init_referenced_generators+32 bmi.n 0x590 <_oscctrl_init_referenced_generators+28> + 0x00000596 _oscctrl_init_referenced_generators+34 ldr r3, [pc, #16] ; (0x5a8 <_oscctrl_init_referenced_generators+52>) + 0x00000598 _oscctrl_init_referenced_generators+36 ldr r2, [r3, #64] ; 0x40 + 0x0000059a _oscctrl_init_referenced_generators+38 lsls r1, r2, #31 + 0x0000059c _oscctrl_init_referenced_generators+40 bmi.n 0x5a4 <_oscctrl_init_referenced_generators+48> + 0x0000059e _oscctrl_init_referenced_generators+42 ldr r2, [r3, #64] ; 0x40 + 0x000005a0 _oscctrl_init_referenced_generators+44 lsls r2, r2, #30 + 0x000005a2 _oscctrl_init_referenced_generators+46 bpl.n 0x598 <_oscctrl_init_referenced_generators+36> +─── Breakpoints ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Expressions ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── History ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Memory ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Registers ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + r0 0x00000000 r1 0x00000000 r2 0x00000000 r3 0x40001000 r4 0x1ffffffd r5 0xfba7dfb7 + r6 0xffffffef r7 0xff7f6ffd r8 0xf7e2d6ef r9 0xffffff7d r10 0xffffefcf r11 0xaf9faffe + r12 0x0000000a sp 0x200100c0 lr 0x0000050f pc 0x0000059a xpsr 0x41000000 fpscr 0x00000000 + msp 0x200100c0 psp 0xfff3df7c primask 0x00 basepri 0x00 faultmask 0x00 control 0x00 +─── Source ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + 908 } + 909 + 910 static inline hri_oscctrl_dpllsyncbusy_reg_t hri_oscctrl_read_DPLLSYNCBUSY_reg(const void *const hw, + 911 uint8_t submodule_index) + 912 { + 913 return ((Oscctrl *)hw)->Dpll[submodule_index].DPLLSYNCBUSY.reg; + 914 } + 915 + 916 static inline bool hri_oscctrl_get_DPLLSTATUS_LOCK_bit(const void *const hw, uint8_t submodule_index) + 917 { + 918 return (((Oscctrl *)hw)->Dpll[submodule_index].DPLLSTATUS.reg & OSCCTRL_DPLLSTATUS_LOCK) + 919 >> OSCCTRL_DPLLSTATUS_LOCK_Pos; + 920 } + 921 + 922 static inline bool hri_oscctrl_get_DPLLSTATUS_CLKRDY_bit(const void *const hw, uint8_t submodule_index) + 923 { + 924 return (((Oscctrl *)hw)->Dpll[submodule_index].DPLLSTATUS.reg & OSCCTRL_DPLLSTATUS_CLKRDY) + 925 >> OSCCTRL_DPLLSTATUS_CLKRDY_Pos; + 926 } + 927 +─── Stack ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[0] from 0x0000059a in _oscctrl_init_referenced_generators+38 at ../hri/hri_oscctrl_e54.h:918 +[1] from 0x0000050e in _init_chip+30 at ../hpl/core/hpl_init.c:63 +[2] from 0x000009ea in init_mcu+4 at ../hal/include/hal_init.h:58 +[3] from 0x000009ea in system_init+6 at ../driver_init.c:104 +[4] from 0x00000dc4 in atmel_start_init+4 at ../atmel_start.c:8 +[5] from 0x000007f2 in main+6 at ../main.c:7 +─── Threads ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[1] id 0 from 0x0000059a in _oscctrl_init_referenced_generators+38 at ../hri/hri_oscctrl_e54.h:918 +─── Variables ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +0x0000059a in _oscctrl_init_referenced_generators () at ../hri/hri_oscctrl_e54.h:918 +918 return (((Oscctrl *)hw)->Dpll[submodule_index].DPLLSTATUS.reg & OSCCTRL_DPLLSTATUS_LOCK) +Breakpoint 1 at 0x7ec: file ../main.c, line 7. +Loading section .text, size 0x1c08 lma 0x0 +Loading section .relocate, size 0x64 lma 0x1c08 +Start address 0x0, load size 7276 +Transfer rate: 54 KB/sec, 808 bytes/write. +─── Output/messages ───────────────────────────────────────────────────────────────────────────────────────────────────────────────── +Note: automatically using hardware breakpoints for read-only addresses. +─── Assembly ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +~ +~ +~ +~ +~ +!0x000007ec main+0 push {r3, lr} + 0x000007ee main+2 ldr r3, [pc, #20] ; (0x804 ) + 0x000007f0 main+4 blx r3 + 0x000007f2 main+6 ldr r3, [pc, #20] ; (0x808 ) + 0x000007f4 main+8 blx r3 +─── Breakpoints ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[1] break at 0x000007ec in ../main.c:7 for main hit 1 time +─── Expressions ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── History ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Memory ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +─── Registers ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + r0 0x20000064 r1 0x00000000 r2 0x00f00000 r3 0x000007ed r4 0x1ffffffd r5 0xfba7dfb7 + r6 0xffffffef r7 0xff7f6ffd r8 0xf7e2d6ef r9 0xffffff7d r10 0xffffefcf r11 0xaf9faffe + r12 0x0000000a sp 0x200100d8 lr 0x000007bd pc 0x000007ec xpsr 0x61000000 fpscr 0x00000000 + msp 0x200100d8 psp 0xfff3df7c primask 0x00 basepri 0x00 faultmask 0x00 control 0x00 +─── Source ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +~ +~ +~ +~ +  1 #include +  2 #include "pdebug.h" +  3 #include "sd_mmc.h" +  4 int main(void) +  5 { +  6 /* Initializes MCU, drivers and middleware */ +! 7 atmel_start_init(); +  8 pdebug_init(); +  9 + 10 printf("Hi\n"); + 11 + 12 sd_mmc_init(); + 13 /* Replace with your application code */ + 14 while (1) { + 15 } + 16 } +─── Stack ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[0] from 0x000007ec in main+0 at ../main.c:7 +─── Threads ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +[1] id -1 from 0x000007ec in main+0 at ../main.c:7 +─── Variables ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + +Breakpoint 1, main () at ../main.c:7 +7 atmel_start_init(); diff --git a/shared/drivers/.#sd_mmc.c b/shared/drivers/.#sd_mmc.c deleted file mode 120000 index 0d5780b..0000000 --- a/shared/drivers/.#sd_mmc.c +++ /dev/null @@ -1 +0,0 @@ -penguin@penguin-arch-home.4569:1608044795 \ No newline at end of file diff --git a/shared/drivers/sd_mmc.c b/shared/drivers/sd_mmc.c index 472e174..27bc9ec 100644 --- a/shared/drivers/sd_mmc.c +++ b/shared/drivers/sd_mmc.c @@ -2,42 +2,22 @@ #include "sd_mmc_intf.h" #include -static bool sd_mmc_check_cd(void) -{ - switch(SD_MMC_CD_MODE) - { - case SD_MMC_CD_MODE_UNUSED: - { - // Always assume the card is detected since we aren't using this function - return true; - }break; - case SD_MMC_CD_MODE_SYNC: - { - return SD_MMC_INTF_CHECK_CD(); - }break; - case SD_MMC_CD_MODE_ASYNC: - { - // Unimplemented - return false; - }break; - default: - { - return false; - } - } - return false; -} -// send 80 clock cycles -static void sd_mmc_send_clock() -{ - uint8_t i; - uint8_t dummy = 0xFF; - for(i = 0; i < 10; i++) - { - SD_MMC_INTF_WRITE(&dummy, 1); - } -} +// Functions used to interact with the SD card +static sd_mmc_err_t sd_mmc_power_up_sequence(); +static sd_mmc_err_t sd_mmc_idle_sequence(); +static sd_mmc_err_t sd_mmc_if_sequence(); +static sd_mmc_err_t sd_mmc_read_ocr(uint8_t* res); +static sd_mmc_err_t sd_mmc_read_res1(uint8_t* res1); +static sd_mmc_err_t sd_mmc_read_res7(uint8_t* res7); +static sd_mmc_err_t sd_mmc_read_res3(uint8_t* res3); +static bool sd_mmc_check_cd(void); +static void sd_mmc_send_clock(void); + +// Functions used for debugging +static void sd_mmc_print_err(sd_mmc_err_t err); +static void sd_mmc_print_res1(uint8_t res); +static void sd_mmc_print_res7(const uint8_t* const res); sd_mmc_err_t sd_mmc_init(void) { @@ -45,34 +25,39 @@ sd_mmc_err_t sd_mmc_init(void) do { + // Hardware initialize if(0 != SD_MMC_INTF_INIT()) { ret = SD_MMC_INIT_FAILURE; break; } - // power up sequence - delay_ms(1); - sd_mmc_send_clock(); - // go idle - sd_mmc_select(0, 0, 0, true); - if(0 != sd_mmc_send_command(CMD0, CMD0_ARG, CMD0_CRC)) + + // Power up sd card sequence + if((ret != sd_mmc_power_up_sequence()) != SD_MMC_SUCCESS) { - ret = SD_MMC_ERR_COMM; break; } - uint8_t res1_ret = 0xFF; - if(0 != sd_mmc_read_res1(&res1_ret)) + // go idle + if((ret != sd_mmc_idle_sequence()) != SD_MMC_SUCCESS) { - ret = SD_MMC_ERR_COMM; break; } - sd_mmc_deselect(0); - + // interface sequence + if((ret != sd_mmc_if_sequence()) != SD_MMC_SUCCESS) + { + break; + } - printf("res1: 0x%02x\n", res1_ret); }while(0); + + if(ret != SD_MMC_SUCCESS) + { + printf("Error initializing SD Card: "); + sd_mmc_print_err(ret); + } + return ret; } @@ -92,7 +77,6 @@ sd_mmc_err_t sd_mmc_select(uint8_t slot, uint32_t clock, uint8_t bus_width, bool sd_mmc_err_t ret = SD_MMC_SUCCESS; SD_MMC_INTF_SELECT_DEVICE(); return ret; - } sd_mmc_err_t sd_mmc_send_command(uint8_t cmd, uint32_t arg, uint8_t crc) @@ -113,7 +97,7 @@ sd_mmc_err_t sd_mmc_send_command(uint8_t cmd, uint32_t arg, uint8_t crc) } -sd_mmc_err_t sd_mmc_read_res1(uint8_t* ret_byte) +sd_mmc_err_t sd_mmc_read_res1(uint8_t* byte) { sd_mmc_err_t ret = SD_MMC_SUCCESS; @@ -121,11 +105,263 @@ sd_mmc_err_t sd_mmc_read_res1(uint8_t* ret_byte) do { i++; - SD_MMC_INTF_READ(ret_byte, 1); - }while(i <= 8 && *ret_byte == 0xFF); - if(*ret_byte == 0xFF) + SD_MMC_INTF_READ(byte, 1); + }while(i <= 8 && *byte == 0xFF); + if(*byte == 0xFF) { return SD_MMC_TIMEOUT; } + + return ret; +} + +sd_mmc_err_t sd_mmc_read_res7(uint8_t* res7) +{ + sd_mmc_err_t ret = SD_MMC_SUCCESS; + do + { + if(5 != SD_MMC_INTF_READ(res7, 5)) + { + ret = SD_MMC_ERR_COMM; + break; + } + + if(res7[0] > 1) + { + // handle this error better later + ret = SD_MMC_ERR_COMM; + break; + } + }while(0); + return ret; +} + +sd_mmc_err_t sd_mmc_read_res3(uint8_t* res3) +{ + sd_mmc_err_t ret = SD_MMC_SUCCESS; + do + { + if(5 != SD_MMC_INTF_READ(res3, 5)) + { + ret = SD_MMC_ERR_COMM; + break; + } + + if(res3[0] > 1) + { + // handle this error better later + ret = SD_MMC_ERR_COMM; + break; + } + }while(0); + return ret; + +} +sd_mmc_err_t sd_mmc_power_up_sequence() +{ + sd_mmc_err_t ret = SD_MMC_SUCCESS; + // power up sequence + delay_ms(1); + sd_mmc_send_clock(); + return ret; +} + +sd_mmc_err_t sd_mmc_idle_sequence() +{ + sd_mmc_err_t ret = SD_MMC_SUCCESS; + uint8_t res1 = 0xFF; + + sd_mmc_select(0, 0, 0, false); + do + { + sd_mmc_select(0, 0, 0, true); + if((ret != sd_mmc_send_command(CMD0, CMD0_ARG, CMD0_CRC)) != SD_MMC_SUCCESS) + { + break; + } + + if((ret != sd_mmc_read_res1(&res1)) != SD_MMC_SUCCESS) + { + break; + } + + sd_mmc_print_res1(res1); + }while(0); + sd_mmc_deselect(0); + return ret; +} +sd_mmc_err_t sd_mmc_if_sequence() +{ + sd_mmc_err_t ret = SD_MMC_SUCCESS; + uint8_t res7[5]; + + sd_mmc_select(0, 0, 0, false); + do + { + + if((ret = sd_mmc_send_command(CMD8, CMD8_ARG, CMD8_CRC)) != SD_MMC_SUCCESS) + { + break; + } + + if((ret = sd_mmc_read_res7(res7)) != SD_MMC_SUCCESS) + { + break; + } + + sd_mmc_print_res7(res7); + }while(0); + sd_mmc_deselect(0); + return ret; +} + +void sd_mmc_print_err(sd_mmc_err_t err) +{ + switch(err) + { + case SD_MMC_SUCCESS: + { + printf("%s", "SD_MMC_SUCCESS\n"); + }break; + case SD_MMC_FAILURE: + { + printf("%s", "SD_MMC_FAILURE\n"); + }break; + case SD_MMC_INIT_ONGOING: + { + printf("%s", "SD_MMC_INIT_ONGOING\n"); + }break; + case SD_MMC_ERR_NO_CARD: + { + printf("%s", "SD_MMC_ERR_NO_CARD\n"); + } + case SD_MMC_ERR_UNUSABLE: + { + printf("%s", "SD_MMC_UNUSABLE\n"); + }break; + case SD_MMC_ERR_SLOT: + { + printf("%s", "SD_MMC_ERR_SLOT\n"); + }break; + case SD_MMC_ERR_COMM: + { + printf("%s", "SD_MMC_ERR_COMM\n"); + }break; + case SD_MMC_ERR_PARAM: + { + printf("%s", "SD_MMC_ERR_PARAM\n"); + }break; + case SD_MMC_ERR_WP: + { + printf("%s", "SD_MMC_ERR_WP\n"); + }break; + case SD_MMC_INIT_FAILURE: + { + printf("%s", "SD_MMC_INIT_FAILURE\n"); + }break; + case SD_MMC_TIMEOUT: + { + printf("%s", "SD_MMC_TIMEOUT\n"); + }break; + default: + { + printf("%s", "UNKNOWN ERROR"); + } + } +} + +void sd_mmc_print_res1(uint8_t res) +{ + if(res & 0b10000000) + { printf("\tError: MSB = 1\r\n"); return; } + if(res == 0) + { printf("\tCard Ready\r\n"); return; } + if(PARAM_ERROR(res)) + printf("\tParameter Error\r\n"); + if(ADDR_ERROR(res)) + printf("\tAddress Error\r\n"); + if(ERASE_SEQ_ERROR(res)) + printf("\tErase Sequence Error\r\n"); + if(CRC_ERROR(res)) + printf("\tCRC Error\r\n"); + if(ILLEGAL_CMD(res)) + printf("\tIllegal Command\r\n"); + if(ERASE_RESET(res)) + printf("\tErase Reset Error\r\n"); + if(IN_IDLE(res)) + printf("\tIn Idle State\r\n"); +} + +void sd_mmc_print_res7(const uint8_t* const res) +{ + sd_mmc_print_res1(res[0]); + if(res[0] > 1) return; + + printf("\tCommand Version: 0x%02x\n", CMD_VER(res[1])); + + printf("\tVoltage Accepted: %s\n", + (res[3] == VOLTAGE_ACC_27_33) ? "2.7-3.6V" + : (res[3] == VOLTAGE_ACC_LOW) ? "LOW VOLTAGE" + : (res[3] == VOLTAGE_ACC_RES1 || res[3] == VOLTAGE_ACC_RES2) ? "RESERVED" + : "NOT DEFINED"); + printf("\tEcho: 0x%02x\n", res[4]); +} + + +bool sd_mmc_check_cd(void) +{ + switch(SD_MMC_CD_MODE) + { + case SD_MMC_CD_MODE_UNUSED: + { + // Always assume the card is detected since we aren't using this function + return true; + }break; + case SD_MMC_CD_MODE_SYNC: + { + return SD_MMC_INTF_CHECK_CD(); + }break; + case SD_MMC_CD_MODE_ASYNC: + { + // Unimplemented + return false; + }break; + default: + { + return false; + } + } + return false; +} + +void sd_mmc_send_clock() +{ + uint8_t i; + uint8_t dummy = 0xFF; + for(i = 0; i < 10; i++) + { + SD_MMC_INTF_WRITE(&dummy, 1); + } +} + +sd_mmc_err_t sd_mmc_read_ocr(uint8_t* res) +{ + sd_mmc_err_t ret = SD_MMC_SUCCESS; + uint8_t res3[5]; + + sd_mmc_select(0, 0, 0, false); + do + { + if((ret = sd_mmc_send_command(CMD58, CMD58_ARG, CMD58_CRC)) != SD_MMC_SUCCESS) + { + break; + } + + if((ret = sd_mmc_read_res3(res3)) != SD_MMC_SUCCESS) + { + break; + } + }while(0); + sd_mmc_deselect(0); return ret; } diff --git a/shared/drivers/sd_mmc.h b/shared/drivers/sd_mmc.h index 47885c6..153512b 100644 --- a/shared/drivers/sd_mmc.h +++ b/shared/drivers/sd_mmc.h @@ -12,17 +12,17 @@ typedef enum sd_mmc_mode_t typedef enum sd_mmc_err_t { - SD_MMC_SUCCESS = 0, - SD_MMC_FAIL = 1, - SD_MMC_INIT_ONGOING = 2, - SD_MMC_ERR_NO_CARD = 3, - SD_MMC_ERR_UNUSABLE = 4, - SD_MMC_ERR_SLOT = 5, - SD_MMC_ERR_COMM = 6, - SD_MMC_ERR_PARAM = 7, - SD_MMC_ERR_WP = 8, - SD_MMC_INIT_FAILURE = 9, - SD_MMC_TIMEOUT = 10 + SD_MMC_SUCCESS = 0, + SD_MMC_FAILURE = 1, + SD_MMC_INIT_ONGOING = 2, + SD_MMC_ERR_NO_CARD = 3, + SD_MMC_ERR_UNUSABLE = 4, + SD_MMC_ERR_SLOT = 5, + SD_MMC_ERR_COMM = 6, + SD_MMC_ERR_PARAM = 7, + SD_MMC_ERR_WP = 8, + SD_MMC_INIT_FAILURE = 9, + SD_MMC_TIMEOUT = 10, } sd_mmc_err_t; // The card detect function can be unused, used regularly, or via interrupt. @@ -41,8 +41,14 @@ sd_mmc_err_t sd_mmc_init(void); sd_mmc_err_t sd_mmc_select(uint8_t slot, uint32_t clock, uint8_t bus_width, bool high_speed); sd_mmc_err_t sd_mmc_deselect(uint8_t slot); sd_mmc_err_t sd_mmc_send_command(uint8_t cmd, uint32_t arg, uint8_t crc); -sd_mmc_err_t sd_mmc_read_res1(uint8_t* ret_byte); +#define PARAM_ERROR(x) (x & 0b01000000) +#define ADDR_ERROR(x) (x & 0b00100000) +#define ERASE_SEQ_ERROR(x) (x & 0b00010000) +#define CRC_ERROR(x) (x & 0b00001000) +#define ILLEGAL_CMD(x) (x & 0b00000100) +#define ERASE_RESET(x) (x & 0b00000010) +#define IN_IDLE(x) (x & 0b00000001) #define SD_MMC_CD_MODE SD_MMC_CD_MODE_SYNC @@ -54,7 +60,23 @@ sd_mmc_err_t sd_mmc_read_res1(uint8_t* ret_byte); #define CMD0_ARG 0x00000000 #define CMD0_CRC 0x94 +#define CMD8 8 +#define CMD8_ARG 0x000001AA +#define CMD8_CRC 0x86 + +#define CMD58 58 +#define CMD58_ARG 0x00000000 +#define CMD58_CRC 0x00 + #define UNUSED(v) (void)(v) +#define CMD_VER(X) ((X >> 4) & 0xF0) +#define VOL_ACC(X) (X & 0x1F) + +#define VOLTAGE_ACC_27_33 0b00000001 +#define VOLTAGE_ACC_LOW 0b00000010 +#define VOLTAGE_ACC_RES1 0b00000100 +#define VOLTAGE_ACC_RES2 0b00001000 + #endif