diff --git a/src/sys.c b/src/sys.c index 4ad3fc3..d178f19 100644 --- a/src/sys.c +++ b/src/sys.c @@ -252,11 +252,10 @@ reset (void) "mov.w r1, #0x1000\n\t" /* 08001000 */ "movt r1, #0x0800\n\t" "str r1, [r0, #8]\n\t" /* SCR->VCR = 0x08001000 */ - "ldr r0, =_text\n\t" - "ldr r1, [r0], #4\n\t" - "msr MSP, r1\n\t" /* Main (exception handler) stack */ - "ldr r1, [r0]\n\t" /* Reset handler */ - "bx r1\n" + "ldr r0, [r1], #4\n\t" + "msr MSP, r0\n\t" /* Main (exception handler) stack */ + "ldr r0, [r1]\n\t" /* Reset handler */ + "bx r0\n" : /* no output */ : /* no input */ : "memory"); } diff --git a/src/sys.h b/src/sys.h index 18b6b3f..609aec0 100644 --- a/src/sys.h +++ b/src/sys.h @@ -1,10 +1,10 @@ typedef void (*handler)(void); -extern handler vector[12]; +extern handler vector[14]; static inline const uint8_t * unique_device_id (void) { - const uint8_t * (*func) (void) = (const uint8_t * (*)(void))vector[0]; + const uint8_t * (*func) (void) = (const uint8_t * (*)(void))vector[2]; return (*func) (); } @@ -12,7 +12,7 @@ unique_device_id (void) static inline void set_led (int on) { - void (*func) (int) = (void (*)(int))vector[1]; + void (*func) (int) = (void (*)(int))vector[3]; return (*func) (on); } @@ -20,13 +20,13 @@ set_led (int on) static inline void flash_unlock (void) { - (*vector[2]) (); + (*vector[4]) (); } static inline int flash_program_halfword (uint32_t addr, uint16_t data) { - int (*func) (uint32_t, uint16_t) = (int (*)(uint32_t, uint16_t))vector[3]; + int (*func) (uint32_t, uint16_t) = (int (*)(uint32_t, uint16_t))vector[5]; return (*func) (addr, data); } @@ -34,7 +34,7 @@ flash_program_halfword (uint32_t addr, uint16_t data) static inline int flash_erase_page (uint32_t addr) { - int (*func) (uint32_t) = (int (*)(uint32_t))vector[4]; + int (*func) (uint32_t) = (int (*)(uint32_t))vector[6]; return (*func) (addr); } @@ -42,7 +42,7 @@ flash_erase_page (uint32_t addr) static inline int flash_check_blank (const uint8_t *p_start, size_t size) { - int (*func) (const uint8_t *, int) = (int (*)(const uint8_t *, int))vector[5]; + int (*func) (const uint8_t *, int) = (int (*)(const uint8_t *, int))vector[7]; return (*func) (p_start, size); } @@ -51,7 +51,7 @@ static inline int flash_write (uint32_t dst_addr, const uint8_t *src, size_t len) { int (*func) (uint32_t, const uint8_t *, size_t) - = (int (*)(uint32_t, const uint8_t *, size_t))vector[6]; + = (int (*)(uint32_t, const uint8_t *, size_t))vector[8]; return (*func) (dst_addr, src, len); } @@ -59,7 +59,7 @@ flash_write (uint32_t dst_addr, const uint8_t *src, size_t len) static inline int flash_protect (void) { - int (*func) (void) = (int (*)(void))vector[7]; + int (*func) (void) = (int (*)(void))vector[9]; return (*func) (); } @@ -67,7 +67,7 @@ flash_protect (void) static inline void __attribute__((noreturn)) flash_mass_erase_and_exec (void) { - void (*func) (void) = (void (*)(void))vector[8]; + void (*func) (void) = (void (*)(void))vector[10]; (*func) (); for (;;); @@ -76,17 +76,17 @@ flash_mass_erase_and_exec (void) static inline void usb_lld_sys_init (void) { - (*vector[9]) (); + (*vector[11]) (); } static inline void usb_lld_sys_shutdown (void) { - (*vector[10]) (); + (*vector[12]) (); } static inline void nvic_system_reset (void) { - (*vector[11]) (); + (*vector[13]) (); }