summaryrefslogtreecommitdiff
path: root/tmk_core/tool/mbed/mbed-sdk/libraries/mbed/targets/cmsis/TARGET_NXP/TARGET_LPC176X/TOOLCHAIN_GCC_CR/startup_LPC17xx.cpp
blob: 4da3084c323e0d919f6f7c938a0b845669c067e6 (plain)
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
extern "C" {

#include "LPC17xx.h"

#define WEAK          __attribute__ ((weak))
#define ALIAS(f)      __attribute__ ((weak, alias (#f)))
#define AFTER_VECTORS __attribute__ ((section(".after_vectors")))

extern unsigned int __data_section_table;
extern unsigned int __data_section_table_end;
extern unsigned int __bss_section_table;
extern unsigned int __bss_section_table_end;

extern void __libc_init_array(void);
extern int main(void);
extern void _vStackTop(void);
extern void (* const g_pfnVectors[])(void);

     void ResetISR          (void);
WEAK void NMI_Handler       (void);
WEAK void HardFault_Handler (void);
WEAK void MemManage_Handler (void);
WEAK void BusFault_Handler  (void);
WEAK void UsageFault_Handler(void);
WEAK void SVC_Handler       (void);
WEAK void DebugMon_Handler  (void);
WEAK void PendSV_Handler    (void);
WEAK void SysTick_Handler   (void);
WEAK void IntDefaultHandler (void);

void WDT_IRQHandler        (void) ALIAS(IntDefaultHandler);
void TIMER0_IRQHandler     (void) ALIAS(IntDefaultHandler);
void TIMER1_IRQHandler     (void) ALIAS(IntDefaultHandler);
void TIMER2_IRQHandler     (void) ALIAS(IntDefaultHandler);
void TIMER3_IRQHandler     (void) ALIAS(IntDefaultHandler);
void UART0_IRQHandler      (void) ALIAS(IntDefaultHandler);
void UART1_IRQHandler      (void) ALIAS(IntDefaultHandler);
void UART2_IRQHandler      (void) ALIAS(IntDefaultHandler);
void UART3_IRQHandler      (void) ALIAS(IntDefaultHandler);
void PWM1_IRQHandler       (void) ALIAS(IntDefaultHandler);
void I2C0_IRQHandler       (void) ALIAS(IntDefaultHandler);
void I2C1_IRQHandler       (void) ALIAS(IntDefaultHandler);
void I2C2_IRQHandler       (void) ALIAS(IntDefaultHandler);
void SPI_IRQHandler        (void) ALIAS(IntDefaultHandler);
void SSP0_IRQHandler       (void) ALIAS(IntDefaultHandler);
void SSP1_IRQHandler       (void) ALIAS(IntDefaultHandler);
void PLL0_IRQHandler       (void) ALIAS(IntDefaultHandler);
void RTC_IRQHandler        (void) ALIAS(IntDefaultHandler);
void EINT0_IRQHandler      (void) ALIAS(IntDefaultHandler);
void EINT1_IRQHandler      (void) ALIAS(IntDefaultHandler);
void EINT2_IRQHandler      (void) ALIAS(IntDefaultHandler);
void EINT3_IRQHandler      (void) ALIAS(IntDefaultHandler);
void ADC_IRQHandler        (void) ALIAS(IntDefaultHandler);
void BOD_IRQHandler        (void) ALIAS(IntDefaultHandler);
void USB_IRQHandler        (void) ALIAS(IntDefaultHandler);
void CAN_IRQHandler        (void) ALIAS(IntDefaultHandler);
void DMA_IRQHandler        (void) ALIAS(IntDefaultHandler);
void I2S_IRQHandler        (void) ALIAS(IntDefaultHandler);
void ENET_IRQHandler       (void) ALIAS(IntDefaultHandler);
void RIT_IRQHandler        (void) ALIAS(IntDefaultHandler);
void MCPWM_IRQHandler      (void) ALIAS(IntDefaultHandler);
void QEI_IRQHandler        (void) ALIAS(IntDefaultHandler);
void PLL1_IRQHandler       (void) ALIAS(IntDefaultHandler);
void USBActivity_IRQHandler(void) ALIAS(IntDefaultHandler);
void CANActivity_IRQHandler(void) ALIAS(IntDefaultHandler);

__attribute__ ((section(".isr_vector")))
void (* const g_pfnVectors[])(void) = {
    &_vStackTop, ResetISR, NMI_Handler,
    HardFault_Handler,
    MemManage_Handler,
    BusFault_Handler,
    UsageFault_Handler,
    0,
    0,
    0,
    0,
    SVC_Handler,
    DebugMon_Handler,
    0,
    PendSV_Handler,
    SysTick_Handler,
    WDT_IRQHandler,
    TIMER0_IRQHandler,
    TIMER1_IRQHandler,
    TIMER2_IRQHandler,
    TIMER3_IRQHandler,
    UART0_IRQHandler,
    UART1_IRQHandler,
    UART2_IRQHandler,
    UART3_IRQHandler,
    PWM1_IRQHandler,
    I2C0_IRQHandler,
    I2C1_IRQHandler,
    I2C2_IRQHandler,
    SPI_IRQHandler,
    SSP0_IRQHandler,
    SSP1_IRQHandler,
    PLL0_IRQHandler,
    RTC_IRQHandler,
    EINT0_IRQHandler,
    EINT1_IRQHandler,
    EINT2_IRQHandler,
    EINT3_IRQHandler,
    ADC_IRQHandler,
    BOD_IRQHandler,
    USB_IRQHandler,
    CAN_IRQHandler,
    DMA_IRQHandler,
    I2S_IRQHandler,
    ENET_IRQHandler,
    RIT_IRQHandler,
    MCPWM_IRQHandler,
    QEI_IRQHandler,
    PLL1_IRQHandler,
    USBActivity_IRQHandler,
    CANActivity_IRQHandler,
};

AFTER_VECTORS void data_init(unsigned int romstart, unsigned int start, unsigned int len) {
    unsigned int *pulDest = (unsigned int*) start;
    unsigned int *pulSrc = (unsigned int*) romstart;
    unsigned int loop;
    for (loop = 0; loop < len; loop = loop + 4) *pulDest++ = *pulSrc++;
}

AFTER_VECTORS void bss_init(unsigned int start, unsigned int len) {
    unsigned int *pulDest = (unsigned int*) start;
    unsigned int loop;
    for (loop = 0; loop < len; loop = loop + 4) *pulDest++ = 0;
}

extern "C" void software_init_hook(void) __attribute__((weak));

AFTER_VECTORS void ResetISR(void) {
    unsigned int LoadAddr, ExeAddr, SectionLen;
    unsigned int *SectionTableAddr;
    
    SectionTableAddr = &__data_section_table;
    
    while (SectionTableAddr < &__data_section_table_end) {
        LoadAddr = *SectionTableAddr++;
        ExeAddr = *SectionTableAddr++;
        SectionLen = *SectionTableAddr++;
        data_init(LoadAddr, ExeAddr, SectionLen);
    }
    while (SectionTableAddr < &__bss_section_table_end) {
        ExeAddr = *SectionTableAddr++;
        SectionLen = *SectionTableAddr++;
        bss_init(ExeAddr, SectionLen);
    }
    
    SystemInit();
    if (software_init_hook) // give control to the RTOS
        software_init_hook(); // this will also call __libc_init_array
    else {
        __libc_init_array();
        main();
    }
    while (1) {;}
}

AFTER_VECTORS void NMI_Handler       (void) {}
AFTER_VECTORS void HardFault_Handler (void) {}
AFTER_VECTORS void MemManage_Handler (void) {}
AFTER_VECTORS void BusFault_Handler  (void) {}
AFTER_VECTORS void UsageFault_Handler(void) {}
AFTER_VECTORS void SVC_Handler       (void) {}
AFTER_VECTORS void DebugMon_Handler  (void) {}
AFTER_VECTORS void PendSV_Handler    (void) {}
AFTER_VECTORS void SysTick_Handler   (void) {}
AFTER_VECTORS void IntDefaultHandler (void) {}

int __aeabi_atexit(void *object, void (*destructor)(void *), void *dso_handle) {return 0;}
}

#include <stdlib.h>

void *operator new(size_t size)  {return malloc(size);}
void *operator new[](size_t size){return malloc(size);}

void operator delete(void *p)   {free(p);}
void operator delete[](void *p) {free(p);}