diff --git a/build/.cache/clangd/index/driver_init.c.D43AF3E174846C58.idx b/build/.cache/clangd/index/driver_init.c.D43AF3E174846C58.idx index 41dc6a7..010b99c 100644 Binary files a/build/.cache/clangd/index/driver_init.c.D43AF3E174846C58.idx and b/build/.cache/clangd/index/driver_init.c.D43AF3E174846C58.idx differ diff --git a/build/.cache/clangd/index/hal_atomic.h.066AAD04FA8F0A31.idx b/build/.cache/clangd/index/hal_atomic.h.066AAD04FA8F0A31.idx index b41037f..4eb72b0 100644 Binary files a/build/.cache/clangd/index/hal_atomic.h.066AAD04FA8F0A31.idx and b/build/.cache/clangd/index/hal_atomic.h.066AAD04FA8F0A31.idx differ diff --git a/build/.cache/clangd/index/hpl_cmcc.h.F300C1A864DEA5F0.idx b/build/.cache/clangd/index/hpl_cmcc.h.F300C1A864DEA5F0.idx index 45cd691..cc3ca2b 100644 Binary files a/build/.cache/clangd/index/hpl_cmcc.h.F300C1A864DEA5F0.idx and b/build/.cache/clangd/index/hpl_cmcc.h.F300C1A864DEA5F0.idx differ diff --git a/build/.cache/clangd/index/hpl_sercom_config.h.DB1E276A55EE99A3.idx b/build/.cache/clangd/index/hpl_sercom_config.h.DB1E276A55EE99A3.idx index 11e2d0a..3ffc106 100644 Binary files a/build/.cache/clangd/index/hpl_sercom_config.h.DB1E276A55EE99A3.idx and b/build/.cache/clangd/index/hpl_sercom_config.h.DB1E276A55EE99A3.idx differ diff --git a/build/.cache/clangd/index/hpl_spi.h.297BABF6466FF14F.idx b/build/.cache/clangd/index/hpl_spi.h.297BABF6466FF14F.idx index 09fba71..d605ff3 100644 Binary files a/build/.cache/clangd/index/hpl_spi.h.297BABF6466FF14F.idx and b/build/.cache/clangd/index/hpl_spi.h.297BABF6466FF14F.idx differ diff --git a/build/.cache/clangd/index/pdebug.h.4C4C1357662BA1EC.idx b/build/.cache/clangd/index/pdebug.h.4C4C1357662BA1EC.idx index 5665bad..e996821 100644 Binary files a/build/.cache/clangd/index/pdebug.h.4C4C1357662BA1EC.idx and b/build/.cache/clangd/index/pdebug.h.4C4C1357662BA1EC.idx differ diff --git a/build/.cache/clangd/index/startup_same54.c.FA8EEC5C0935C5CC.idx b/build/.cache/clangd/index/startup_same54.c.FA8EEC5C0935C5CC.idx index adb6d3f..bd09f9a 100644 Binary files a/build/.cache/clangd/index/startup_same54.c.FA8EEC5C0935C5CC.idx and b/build/.cache/clangd/index/startup_same54.c.FA8EEC5C0935C5CC.idx differ diff --git a/build/.cache/clangd/index/stdarg.h.BC7E480AEDEEE302.idx b/build/.cache/clangd/index/stdarg.h.BC7E480AEDEEE302.idx index 22efa81..8b20e9a 100644 Binary files a/build/.cache/clangd/index/stdarg.h.BC7E480AEDEEE302.idx and b/build/.cache/clangd/index/stdarg.h.BC7E480AEDEEE302.idx differ diff --git a/build/.cache/clangd/index/system_same54.c.FA3E2D5F8ABF1AF1.idx b/build/.cache/clangd/index/system_same54.c.FA3E2D5F8ABF1AF1.idx index 4bc41b5..c99fcde 100644 Binary files a/build/.cache/clangd/index/system_same54.c.FA3E2D5F8ABF1AF1.idx and b/build/.cache/clangd/index/system_same54.c.FA3E2D5F8ABF1AF1.idx differ 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