YAHAL
Yet Another Hardware Abstraction Library
Loading...
Searching...
No Matches
startup_rp2350.cpp
1// ---------------------------------------------
2// This file is part of
3// _ _ __ _ _ __ __
4// ( \/ ) /__\ ( )_( ) /__\ ( )
5// \ / /(__)\ ) _ ( /(__)\ )(__
6// (__)(__)(__)(_) (_)(__)(__)(____)
7//
8// Yet Another HW Abstraction Library
9// Copyright (C) Andreas Terstegge
10// BSD Licensed (see file LICENSE)
11//
12// ---------------------------------------------
13//
14// Startup code for RP2350.
15//
16#include "boot/boot_blocks.h"
17#include "system_rp2350.h"
18#include "RP2350.h"
19
20#ifdef __cplusplus
21extern "C" {
22#endif
23
24// Macro Definitions
25#define WEAK_FUNC(FUN) \
26void FUN(void) __attribute__ ((weak));
27#define WEAK_INT_FUNC(FUN) \
28int FUN() __attribute__ ((weak));
29#define WEAK_ALIAS_FUNC(FUN, FUN_ALIAS) \
30void FUN(void) __attribute__ ((weak, alias(#FUN_ALIAS)));
31#define WEAK_ALIAS_INT_FUNC(FUN, FUN_ALIAS) \
32int FUN() __attribute__ ((weak, alias(#FUN_ALIAS)));
33
34// External variables and functions
35extern void reset_handler();
36extern uint32_t __StackTop;
37
38typedef void (*pFunc)();
39
40// Forward declaration of the implemented handlers.
41WEAK_FUNC(Default_Handler)
42WEAK_FUNC(Reset_Handler)
43WEAK_INT_FUNC(return_0)
44
45// Cortex-M33 Processor Exceptions
46WEAK_ALIAS_FUNC(NMI_Handler, Default_Handler)
47WEAK_ALIAS_FUNC(HardFault_Handler, Default_Handler)
48WEAK_ALIAS_FUNC(MemoryManagement_Handler, Default_Handler)
49WEAK_ALIAS_FUNC(BusFault_Handler, Default_Handler)
50WEAK_ALIAS_FUNC(UsageFault_Handler, Default_Handler)
51WEAK_ALIAS_FUNC(SecureFault_Handler, Default_Handler)
52WEAK_ALIAS_FUNC(SVC_Handler, Default_Handler)
53WEAK_ALIAS_FUNC(DebugMonitor_Handler, Default_Handler)
54WEAK_ALIAS_FUNC(PendSV_Handler, Default_Handler)
55WEAK_ALIAS_FUNC(SysTick_Handler, Default_Handler)
56
57// Device specific interrupt handler
58
59WEAK_ALIAS_FUNC(TIMER0_IRQ_0_Handler, Default_Handler)
60WEAK_ALIAS_FUNC(TIMER0_IRQ_1_Handler, Default_Handler)
61WEAK_ALIAS_FUNC(TIMER0_IRQ_2_Handler, Default_Handler)
62WEAK_ALIAS_FUNC(TIMER0_IRQ_3_Handler, Default_Handler)
63WEAK_ALIAS_FUNC(TIMER1_IRQ_0_Handler, Default_Handler)
64WEAK_ALIAS_FUNC(TIMER1_IRQ_1_Handler, Default_Handler)
65WEAK_ALIAS_FUNC(TIMER1_IRQ_2_Handler, Default_Handler)
66WEAK_ALIAS_FUNC(TIMER1_IRQ_3_Handler, Default_Handler)
67WEAK_ALIAS_FUNC(PWM_IRQ_WRAP_0_Handler, Default_Handler)
68WEAK_ALIAS_FUNC(PWM_IRQ_WRAP_1_Handler, Default_Handler)
69WEAK_ALIAS_FUNC(DMA_IRQ_0_Handler, Default_Handler)
70WEAK_ALIAS_FUNC(DMA_IRQ_1_Handler, Default_Handler)
71WEAK_ALIAS_FUNC(DMA_IRQ_2_Handler, Default_Handler)
72WEAK_ALIAS_FUNC(DMA_IRQ_3_Handler, Default_Handler)
73WEAK_ALIAS_FUNC(USBCTRL_IRQ_Handler, Default_Handler)
74WEAK_ALIAS_FUNC(PIO0_IRQ_0_Handler, Default_Handler)
75WEAK_ALIAS_FUNC(PIO0_IRQ_1_Handler, Default_Handler)
76WEAK_ALIAS_FUNC(PIO1_IRQ_0_Handler, Default_Handler)
77WEAK_ALIAS_FUNC(PIO1_IRQ_1_Handler, Default_Handler)
78WEAK_ALIAS_FUNC(PIO2_IRQ_0_Handler, Default_Handler)
79WEAK_ALIAS_FUNC(PIO2_IRQ_1_Handler, Default_Handler)
80WEAK_ALIAS_FUNC(IO_IRQ_BANK0_Handler, Default_Handler)
81WEAK_ALIAS_FUNC(IO_IRQ_BANK0_NS_Handler, Default_Handler)
82WEAK_ALIAS_FUNC(IO_IRQ_QSPI_Handler, Default_Handler)
83WEAK_ALIAS_FUNC(IO_IRQ_QSPI_NS_Handler, Default_Handler)
84WEAK_ALIAS_FUNC(SIO_IRQ_FIFO_Handler, Default_Handler)
85WEAK_ALIAS_FUNC(SIO_IRQ_BELL_Handler, Default_Handler)
86WEAK_ALIAS_FUNC(SIO_IRQ_FIFO_NS_Handler, Default_Handler)
87WEAK_ALIAS_FUNC(SIO_IRQ_BELL_NS_Handler, Default_Handler)
88WEAK_ALIAS_FUNC(SIO_IRQ_MTIMECMP_Handler, Default_Handler)
89WEAK_ALIAS_FUNC(CLOCKS_IRQ_Handler, Default_Handler)
90WEAK_ALIAS_FUNC(SPI0_IRQ_Handler, Default_Handler)
91WEAK_ALIAS_FUNC(SPI1_IRQ_Handler, Default_Handler)
92WEAK_ALIAS_FUNC(UART0_IRQ_Handler, Default_Handler)
93WEAK_ALIAS_FUNC(UART1_IRQ_Handler, Default_Handler)
94WEAK_ALIAS_FUNC(ADC_IRQ_FIFO_Handler, Default_Handler)
95WEAK_ALIAS_FUNC(I2C0_IRQ_Handler, Default_Handler)
96WEAK_ALIAS_FUNC(I2C1_IRQ_Handler, Default_Handler)
97WEAK_ALIAS_FUNC(OTP_IRQ_Handler, Default_Handler)
98WEAK_ALIAS_FUNC(TRNG_IRQ_Handler, Default_Handler)
99WEAK_ALIAS_FUNC(PLL_SYS_IRQ_Handler, Default_Handler)
100WEAK_ALIAS_FUNC(PLL_USB_IRQ_Handler, Default_Handler)
101WEAK_ALIAS_FUNC(POWMAN_IRQ_POW_Handler, Default_Handler)
102WEAK_ALIAS_FUNC(POWMAN_IRQ_TIMER_Handler, Default_Handler)
103
104// The interrupt vector table.
105void (* const isr_vector[])(void) __attribute__((section(".isr_vector"), used)) = {
106 (pFunc) &__StackTop, // The initial stack pointer
107
108 reset_handler, // -15 The reset handler
109 NMI_Handler, // -14 The NMI handler
110 HardFault_Handler, // -13 The hard fault handler
111 MemoryManagement_Handler, // -12 The Memory Management handler
112 BusFault_Handler, // -11 The Bus Fault handler
113 UsageFault_Handler, // -10 The Usage Fault handler
114 SecureFault_Handler, // -9 The Secure Fault handler
115 nullptr, // -8 Reserved
116 nullptr, // -7 Reserved
117 nullptr, // -6 Reserved
118 SVC_Handler, // -5 SVCall handler
119 DebugMonitor_Handler, // -4 The Debug Monitor handler
120 nullptr, // -3 Reserved
121 PendSV_Handler, // -2 The PendSV handler
122 SysTick_Handler, // -1 The SysTick handler
123
124 TIMER0_IRQ_0_Handler, // 0 TIMER0_IRQ_0
125 TIMER0_IRQ_1_Handler, // 1 TIMER0_IRQ_1
126 TIMER0_IRQ_2_Handler, // 2 TIMER0_IRQ_2
127 TIMER0_IRQ_3_Handler, // 3 TIMER0_IRQ_3
128 TIMER1_IRQ_0_Handler, // 4 TIMER1_IRQ_0
129 TIMER1_IRQ_1_Handler, // 5 TIMER1_IRQ_1
130 TIMER1_IRQ_2_Handler, // 6 TIMER1_IRQ_2
131 TIMER1_IRQ_3_Handler, // 7 TIMER1_IRQ_3
132 PWM_IRQ_WRAP_0_Handler, // 8 PWM_IRQ_WRAP_0
133 PWM_IRQ_WRAP_1_Handler, // 9 PWM_IRQ_WRAP_1
134 DMA_IRQ_0_Handler, // 10 DMA_IRQ_0
135 DMA_IRQ_1_Handler, // 11 DMA_IRQ_1
136 DMA_IRQ_2_Handler, // 12 DMA_IRQ_2
137 DMA_IRQ_3_Handler, // 13 DMA_IRQ_3
138 USBCTRL_IRQ_Handler, // 14 USBCTRL_IRQ
139 PIO0_IRQ_0_Handler, // 15 PIO0_IRQ_0
140 PIO0_IRQ_1_Handler, // 16 PIO0_IRQ_1
141 PIO1_IRQ_0_Handler, // 17 PIO1_IRQ_0
142 PIO1_IRQ_1_Handler, // 18 PIO1_IRQ_1
143 PIO2_IRQ_0_Handler, // 19 PIO2_IRQ_0
144 PIO2_IRQ_1_Handler, // 20 PIO2_IRQ_1
145 IO_IRQ_BANK0_Handler, // 21 IO_IRQ_BANK0
146 IO_IRQ_BANK0_NS_Handler, // 22 IO_IRQ_BANK0_NS
147 IO_IRQ_QSPI_Handler, // 23 IO_IRQ_QSPI
148 IO_IRQ_QSPI_NS_Handler, // 24 IO_IRQ_QSPI_NS
149 SIO_IRQ_FIFO_Handler, // 25 SIO_IRQ_FIFO
150 SIO_IRQ_BELL_Handler, // 26 SIO_IRQ_BELL
151 SIO_IRQ_FIFO_NS_Handler, // 27 SIO_IRQ_FIFO_NS
152 SIO_IRQ_BELL_NS_Handler, // 28 SIO_IRQ_BELL_NS
153 SIO_IRQ_MTIMECMP_Handler, // 29 SIO_IRQ_MTIMECMP
154 CLOCKS_IRQ_Handler, // 30 CLOCKS_IRQ
155 SPI0_IRQ_Handler, // 31 SPI0_IRQ
156 SPI1_IRQ_Handler, // 32 SPI1_IRQ
157 UART0_IRQ_Handler, // 33 UART0_IRQ
158 UART1_IRQ_Handler, // 34 UART1_IRQ
159 ADC_IRQ_FIFO_Handler, // 35 ADC_IRQ_FIFO
160 I2C0_IRQ_Handler, // 36 I2C0_IRQ
161 I2C1_IRQ_Handler, // 37 I2C1_IRQ
162 OTP_IRQ_Handler, // 38 OTP_IRQ
163 TRNG_IRQ_Handler, // 39 TRNG_IRQ
164 PLL_SYS_IRQ_Handler, // 42 PLL_SYS_IRQ
165 PLL_USB_IRQ_Handler, // 43 PLL_USB_IRQ
166 POWMAN_IRQ_POW_Handler, // 44 POWMAN_IRQ_POW
167 POWMAN_IRQ_TIMER_Handler // 45 POWMAN_IRQ_TIMER
168};
169
170namespace BLOCKS {
171
172 constexpr blocks<0> start;
173 constexpr auto header = HEADER (start);
174 constexpr auto image = IMAGE_DEF (header,
175 image_type::TYPE_EXE,
176 exe_security::SEC_S,
177 exe_cpu::CPU_ARM,
178 exe_chip::CHIP_RP2350);
179 constexpr auto last = LAST_ITEM (image, image.size() - header.size());
180 constexpr auto link = LINK (last, 0);
181 constexpr auto footer = FOOTER (link);
182};
183
184// Put the calculated boot blocks into the correct section during compile/link-time
185const auto boot_blocks __attribute__((section(".boot_blocks"), used)) = BLOCKS::footer;
186
187// The reset irq handler
188void Reset_Handler(void) {
189 // Initialize the hardware
190 SystemInit();
191 // Let CMSIS code do the initialization of the C++ runtime and jump to main.
193}
194
195// This is the code that gets called when the processor receives an unexpected
196// interrupt. This simply enters an infinite loop, preserving the system state
197// for examination by a debugger.
198void Default_Handler(void) {
199 // Enter an infinite loop.
200 while (true) { }
201}
202
203// Dummy Posix File IO functions to suppress linker warnings
204WEAK_ALIAS_INT_FUNC( _read, return_0 );
205WEAK_ALIAS_INT_FUNC( _write, return_0 );
206WEAK_ALIAS_INT_FUNC( _open, return_0 );
207WEAK_ALIAS_INT_FUNC( _close, return_0 );
208WEAK_ALIAS_INT_FUNC( _link, return_0 );
209WEAK_ALIAS_INT_FUNC( _unlink, return_0 );
210WEAK_ALIAS_INT_FUNC( _stat, return_0 );
211WEAK_ALIAS_INT_FUNC( _fstat, return_0 );
212WEAK_ALIAS_INT_FUNC( _lseek, return_0 );
213WEAK_ALIAS_INT_FUNC( _isatty, return_0 );
214WEAK_ALIAS_INT_FUNC( _kill, return_0 );
215WEAK_ALIAS_INT_FUNC( _getpid, return_0 );
216
217int return_0() {
218 return 0;
219}
220
221#ifdef __cplusplus
222}
223#endif
__STATIC_FORCEINLINE __NO_RETURN void __cmsis_start(void)
Initializes data and bss sections.
Definition cmsis_gcc.h:137
void __attribute__((noreturn))(*rom_reset_usb_boot_fn)(uint32_t
Reboot the device into BOOTSEL mode.
Definition bootrom.h:66