YAHAL
Yet Another Hardware Abstraction Library
Loading...
Searching...
No Matches
startup_rp2040.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 RP2040
15//
16#include "boot/boot_blocks.h"
17#include "system_rp2040.h"
18#include "RP2040.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)(void);
39
40// Forward declaration of the implemented handlers.
41WEAK_FUNC(Default_Handler)
42WEAK_FUNC(Reset_Handler)
43WEAK_INT_FUNC(return_0)
44
45// Cortex-M0+ Processor Exceptions
46WEAK_ALIAS_FUNC(NMI_Handler, Default_Handler)
47WEAK_ALIAS_FUNC(HardFault_Handler, Default_Handler)
48WEAK_ALIAS_FUNC(SVC_Handler, Default_Handler)
49WEAK_ALIAS_FUNC(PendSV_Handler, Default_Handler)
50WEAK_ALIAS_FUNC(SysTick_Handler, Default_Handler)
51
52// Device specific interrupt handler
53WEAK_ALIAS_FUNC(TIMER_IRQ_0_Handler, Default_Handler)
54WEAK_ALIAS_FUNC(TIMER_IRQ_1_Handler, Default_Handler)
55WEAK_ALIAS_FUNC(TIMER_IRQ_2_Handler, Default_Handler)
56WEAK_ALIAS_FUNC(TIMER_IRQ_3_Handler, Default_Handler)
57WEAK_ALIAS_FUNC(PWM_IRQ_WRAP_Handler, Default_Handler)
58WEAK_ALIAS_FUNC(USBCTRL_IRQ_Handler, Default_Handler)
59WEAK_ALIAS_FUNC(XIP_IRQ_Handler, Default_Handler)
60WEAK_ALIAS_FUNC(PIO0_IRQ_0_Handler, Default_Handler)
61WEAK_ALIAS_FUNC(PIO0_IRQ_1_Handler, Default_Handler)
62WEAK_ALIAS_FUNC(PIO1_IRQ_0_Handler, Default_Handler)
63WEAK_ALIAS_FUNC(PIO1_IRQ_1_Handler, Default_Handler)
64WEAK_ALIAS_FUNC(DMA_IRQ_0_Handler, Default_Handler)
65WEAK_ALIAS_FUNC(DMA_IRQ_1_Handler, Default_Handler)
66WEAK_ALIAS_FUNC(IO_IRQ_BANK0_Handler, Default_Handler)
67WEAK_ALIAS_FUNC(IO_IRQ_QSPI_Handler, Default_Handler)
68WEAK_ALIAS_FUNC(SIO_IRQ_PROC0_Handler, Default_Handler)
69WEAK_ALIAS_FUNC(SIO_IRQ_PROC1_Handler, Default_Handler)
70WEAK_ALIAS_FUNC(CLOCKS_IRQ_Handler, Default_Handler)
71WEAK_ALIAS_FUNC(SPI0_IRQ_Handler, Default_Handler)
72WEAK_ALIAS_FUNC(SPI1_IRQ_Handler, Default_Handler)
73WEAK_ALIAS_FUNC(UART0_IRQ_Handler, Default_Handler)
74WEAK_ALIAS_FUNC(UART1_IRQ_Handler, Default_Handler)
75WEAK_ALIAS_FUNC(ADC_IRQ_FIFO_Handler, Default_Handler)
76WEAK_ALIAS_FUNC(I2C0_IRQ_Handler, Default_Handler)
77WEAK_ALIAS_FUNC(I2C1_IRQ_Handler, Default_Handler)
78WEAK_ALIAS_FUNC(RTC_IRQ_Handler, Default_Handler)
79
80// The interrupt vector table.
81void (* const isr_vector[])(void) __attribute__((section(".isr_vector"), used)) = {
82 (pFunc) &__StackTop, // The initial stack pointer
83
84 reset_handler, // -15 The reset handler
85 NMI_Handler, // -14 The NMI handler
86 HardFault_Handler, // -13 The hard fault handler
87 0, // -12 Reserved
88 0, // -11 Reserved
89 0, // -10 Reserved
90 0, // -9 Reserved
91 0, // -8 Reserved
92 0, // -7 Reserved
93 0, // -6 Reserved
94 SVC_Handler, // -5 SVCall handler
95 0, // -4 Reserved
96 0, // -3 Reserved
97 PendSV_Handler, // -2 The PendSV handler
98 SysTick_Handler, // -1 The SysTick handler
99
100 TIMER_IRQ_0_Handler, // 0 TIMER_IRQ_0
101 TIMER_IRQ_1_Handler, // 1 TIMER_IRQ_1
102 TIMER_IRQ_2_Handler, // 2 TIMER_IRQ_2
103 TIMER_IRQ_3_Handler, // 3 TIMER_IRQ_3
104 PWM_IRQ_WRAP_Handler, // 4 PWM_IRQ_WRAP
105 USBCTRL_IRQ_Handler, // 5 USBCTRL_IRQ
106 XIP_IRQ_Handler, // 6 XIP_IRQ
107 PIO0_IRQ_0_Handler, // 7 PIO0_IRQ_0
108 PIO0_IRQ_1_Handler, // 8 PIO0_IRQ_1
109 PIO1_IRQ_0_Handler, // 9 PIO1_IRQ_0
110 PIO1_IRQ_1_Handler, // 10 PIO1_IRQ_1
111 DMA_IRQ_0_Handler, // 11 DMA_IRQ_0
112 DMA_IRQ_1_Handler, // 12 DMA_IRQ_1
113 IO_IRQ_BANK0_Handler, // 13 IO_IRQ_BANK0
114 IO_IRQ_QSPI_Handler, // 14 IO_IRQ_QSPI
115 SIO_IRQ_PROC0_Handler, // 15 SIO_IRQ_PROC0
116 SIO_IRQ_PROC1_Handler, // 16 SIO_IRQ_PROC1
117 CLOCKS_IRQ_Handler, // 17 CLOCKS_IRQ
118 SPI0_IRQ_Handler, // 18 SPI0_IRQ
119 SPI1_IRQ_Handler, // 19 SPI1_IRQ
120 UART0_IRQ_Handler, // 20 UART0_IRQ
121 UART1_IRQ_Handler, // 21 UART1_IRQ
122 ADC_IRQ_FIFO_Handler, // 22 ADC_IRQ_FIFO
123 I2C0_IRQ_Handler, // 23 I2C0_IRQ
124 I2C1_IRQ_Handler, // 24 I2C1_IRQ
125 RTC_IRQ_Handler // 25 RTC_IRQ
126};
127
128#define MAJOR_VER 1
129#define MINOR_VER 0
130
131namespace BLOCKS {
132
133 constexpr blocks<0> start;
134 constexpr auto header = HEADER (start);
135 constexpr auto image = IMAGE_DEF (header,
136 image_type::TYPE_EXE,
137 exe_security::UNSPECIFIED,
138 exe_cpu::CPU_ARM,
139 exe_chip::CHIP_RP2040);
140 constexpr auto version = VERSION (image, MAJOR_VER, MINOR_VER);
141 constexpr auto last = LAST_ITEM (version, version.size() - header.size());
142 constexpr auto link = LINK (last, 0);
143 constexpr auto footer = FOOTER (link);
144};
145
146// Put the calculated boot blocks into the correct section during compile/link-time
147const auto boot_blocks __attribute__((section(".boot_blocks"), used)) = BLOCKS::footer;
148
149
150// The reset irq handler
151void Reset_Handler(void) {
152 // Initialize the hardware
153 SystemInit();
154 // Let CMSIS code do the initialization of the C++ runtime and jump to main.
156}
157
158// This is the code that gets called when the processor receives an unexpected
159// interrupt. This simply enters an infinite loop, preserving the system state
160// for examination by a debugger.
161void Default_Handler(void) {
162 // Enter an infinite loop.
163 while (true) { }
164}
165
166// Dummy Posix File IO functions to suppress linker warnings
167WEAK_ALIAS_INT_FUNC( _read, return_0 );
168WEAK_ALIAS_INT_FUNC( _write, return_0 );
169WEAK_ALIAS_INT_FUNC( _open, return_0 );
170WEAK_ALIAS_INT_FUNC( _close, return_0 );
171WEAK_ALIAS_INT_FUNC( _link, return_0 );
172WEAK_ALIAS_INT_FUNC( _unlink, return_0 );
173WEAK_ALIAS_INT_FUNC( _stat, return_0 );
174WEAK_ALIAS_INT_FUNC( _fstat, return_0 );
175WEAK_ALIAS_INT_FUNC( _lseek, return_0 );
176WEAK_ALIAS_INT_FUNC( _isatty, return_0 );
177WEAK_ALIAS_INT_FUNC( _kill, return_0 );
178WEAK_ALIAS_INT_FUNC( _getpid, return_0 );
179
180int return_0() {
181 return 0;
182}
183
184#ifdef __cplusplus
185}
186#endif
__STATIC_FORCEINLINE __NO_RETURN void __cmsis_start(void)
Initializes data and bss sections.
Definition cmsis_gcc.h:137
CMSIS-Core(M) Device Peripheral Access Layer Header File for Device RP2040.
void __attribute__((noreturn))(*rom_reset_usb_boot_fn)(uint32_t
Reboot the device into BOOTSEL mode.
Definition bootrom.h:66