1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
/* Copyright 2014 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*
* Cortex-M0 CPU initialization
*/
#include "config.h"
#ifdef CHIP_FAMILY_STM32F0
/* Allocate space for SRAM vector table at SRAM based address */
.section .bss.vector_table
sram_vtable: .skip (48*4)
#endif
.text
.syntax unified
.code 16
.global reset
.thumb_func
reset:
/*
* Ensure we're in privileged mode with main stack. Necessary if
* we've jumped directly here from another image after task_start().
*/
movs r0, #0 @ priv. mode / main stack / no floating point
msr control, r0
isb @ ensure the write is done
/* Clear BSS */
movs r0, #0
ldr r1,_bss_start
ldr r2,_bss_end
bss_loop:
str r0, [r1]
adds r1, #4
cmp r1, r2
blt bss_loop
#ifdef CHIP_FAMILY_STM32F0
/*
* STM32F0 parts don't have the VTOR register for relocating
* the vector table. Instead, we must copy the vector table from
* flash into SRAM.
*/
ldr r1, =vectors
ldr r2, =sram_vtable
movs r0, #0
vtable_loop:
ldr r3, [r1]
str r3, [r2]
adds r1, #4
adds r2, #4
adds r0, #1
cmp r0, #48
blt vtable_loop
/* Set SYSCFG_CFGR1 mem_mode to load vector table from SRAM */
movs r0, #3
ldr r1, =0x40010000
str r0, [r1]
#else
/* Set the vector table on our current code */
ldr r1, =vectors
ldr r2, =0xE000ED08 /* VTOR register in SCB*/
str r1, [r2]
#endif
/* Copy initialized data to Internal RAM */
ldr r0,_data_lma_start
ldr r1,_data_start
ldr r2,_data_end
data_loop:
ldr r3, [r0]
adds r0, #4
str r3, [r1]
adds r1, #4
cmp r1, r2
blt data_loop
/*
* Set stack pointer. Already done by Cortex-M hardware, but re-doing
* this here allows software to jump directly to the reset vector.
*/
ldr r0, =stack_end
mov sp, r0
/* Jump to C code */
bl main
/* That should not return. If it does, loop forever. */
fini_loop:
b fini_loop
/* Default exception handler */
.thumb_func
default_handler:
ldr r0, =exception_panic
bx r0
.align 2
_bss_start:
.long __bss_start
_bss_end:
.long __bss_end
_data_start:
.long __data_start
_data_end:
.long __data_end
_data_lma_start:
.long __data_lma_start
/* Mock functions to avoid linker complaints */
.global __aeabi_unwind_cpp_pr0
.global __aeabi_unwind_cpp_pr1
.global __aeabi_unwind_cpp_pr2
__aeabi_unwind_cpp_pr0:
__aeabi_unwind_cpp_pr1:
__aeabi_unwind_cpp_pr2:
bx lr
/* Reserve space for system stack */
.section .bss.system_stack
stack_start:
.space CONFIG_STACK_SIZE, 0
stack_end:
.global stack_end
|