mirror of https://github.com/ARMmbed/mbed-os.git
commit
1bb14b7492
|
|
@ -52,7 +52,7 @@ Typedef definitions
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
Macro definitions
|
Macro definitions
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
#define DUMMY_ACCESS (*(volatile unsigned long *)(OSTM0CNT))
|
#define DUMMY_ACCESS OSTM0CNT
|
||||||
|
|
||||||
/* #define CACHE_WRITEBACK */
|
/* #define CACHE_WRITEBACK */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -515,10 +515,10 @@ extern "C" {
|
||||||
if (RZA_IO_RegRead_16(
|
if (RZA_IO_RegRead_16(
|
||||||
&g_usb0_function_pipecfg[pipe], USB_PIPECFG_DIR_SHIFT, USB_PIPECFG_DIR) == 0) {
|
&g_usb0_function_pipecfg[pipe], USB_PIPECFG_DIR_SHIFT, USB_PIPECFG_DIR) == 0) {
|
||||||
/* read */
|
/* read */
|
||||||
__nop();
|
__NOP();
|
||||||
} else {
|
} else {
|
||||||
/* write */
|
/* write */
|
||||||
__nop();
|
__NOP();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -629,7 +629,7 @@ extern "C" {
|
||||||
if (RZA_IO_RegRead_16(
|
if (RZA_IO_RegRead_16(
|
||||||
&g_usb0_function_pipecfg[pipe], USB_PIPECFG_DIR_SHIFT, USB_PIPECFG_DIR) == 0) {
|
&g_usb0_function_pipecfg[pipe], USB_PIPECFG_DIR_SHIFT, USB_PIPECFG_DIR) == 0) {
|
||||||
/* read */
|
/* read */
|
||||||
__nop();
|
__NOP();
|
||||||
} else {
|
} else {
|
||||||
/* write */
|
/* write */
|
||||||
EPx_read_status = DEVDRV_USBF_PIPE_WAIT;
|
EPx_read_status = DEVDRV_USBF_PIPE_WAIT;
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@ Typedef definitions
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
Macro definitions
|
Macro definitions
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
#define DUMMY_ACCESS (*(volatile unsigned long *)(OSTM0CNT))
|
#define DUMMY_ACCESS OSTM0CNT
|
||||||
|
|
||||||
/* #define CACHE_WRITEBACK */
|
/* #define CACHE_WRITEBACK */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -237,6 +237,7 @@ void USBHALHost::_usbisr(void) {
|
||||||
|
|
||||||
void USBHALHost::UsbIrqhandler() {
|
void USBHALHost::UsbIrqhandler() {
|
||||||
uint32_t int_status = ohciwrapp_reg_r(OHCI_REG_INTERRUPTSTATUS) & ohciwrapp_reg_r(OHCI_REG_INTERRUPTENABLE);
|
uint32_t int_status = ohciwrapp_reg_r(OHCI_REG_INTERRUPTSTATUS) & ohciwrapp_reg_r(OHCI_REG_INTERRUPTENABLE);
|
||||||
|
uint32_t data;
|
||||||
|
|
||||||
if (int_status != 0) { //Is there something to actually process?
|
if (int_status != 0) { //Is there something to actually process?
|
||||||
// Root hub status change interrupt
|
// Root hub status change interrupt
|
||||||
|
|
@ -254,7 +255,8 @@ void USBHALHost::UsbIrqhandler() {
|
||||||
wait_ms(150);
|
wait_ms(150);
|
||||||
|
|
||||||
//Hub 0 (root hub), Port 1 (count starts at 1), Low or High speed
|
//Hub 0 (root hub), Port 1 (count starts at 1), Low or High speed
|
||||||
deviceConnected(0, 1, ohciwrapp_reg_r(OHCI_REG_RHPORTSTATUS1) & OR_RH_PORT_LSDA);
|
data = ohciwrapp_reg_r(OHCI_REG_RHPORTSTATUS1) & OR_RH_PORT_LSDA;
|
||||||
|
deviceConnected(0, 1, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Root device disconnected
|
//Root device disconnected
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
#ifndef MBED_H
|
#ifndef MBED_H
|
||||||
#define MBED_H
|
#define MBED_H
|
||||||
|
|
||||||
#define MBED_LIBRARY_VERSION 94
|
#define MBED_LIBRARY_VERSION 95
|
||||||
|
|
||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -459,6 +459,10 @@ extern "C" void __iar_argc_argv() {
|
||||||
// Linker defined symbol used by _sbrk to indicate where heap should start.
|
// Linker defined symbol used by _sbrk to indicate where heap should start.
|
||||||
extern "C" int __end__;
|
extern "C" int __end__;
|
||||||
|
|
||||||
|
#if defined(TARGET_CORTEX_A)
|
||||||
|
extern "C" uint32_t __HeapLimit;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Turn off the errno macro and use actual global variable instead.
|
// Turn off the errno macro and use actual global variable instead.
|
||||||
#undef errno
|
#undef errno
|
||||||
extern "C" int errno;
|
extern "C" int errno;
|
||||||
|
|
@ -474,6 +478,8 @@ extern "C" caddr_t _sbrk(int incr) {
|
||||||
|
|
||||||
#if defined(TARGET_ARM7)
|
#if defined(TARGET_ARM7)
|
||||||
if (new_heap >= stack_ptr) {
|
if (new_heap >= stack_ptr) {
|
||||||
|
#elif defined(TARGET_CORTEX_A)
|
||||||
|
if (new_heap >= (unsigned char*)&__HeapLimit) { /* __HeapLimit is end of heap section */
|
||||||
#else
|
#else
|
||||||
if (new_heap >= (unsigned char*)__get_MSP()) {
|
if (new_heap >= (unsigned char*)__get_MSP()) {
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -116,3 +116,17 @@ void us_ticker_remove_event(ticker_event_t *obj) {
|
||||||
|
|
||||||
__enable_irq();
|
__enable_irq();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int us_ticker_get_next_timestamp(timestamp_t *timestamp) {
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
/* if head is NULL, there are no pending events */
|
||||||
|
__disable_irq();
|
||||||
|
if (head != NULL) {
|
||||||
|
*timestamp = head->timestamp;
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
__enable_irq();
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,7 @@ void us_ticker_irq_handler(void);
|
||||||
|
|
||||||
void us_ticker_insert_event(ticker_event_t *obj, timestamp_t timestamp, uint32_t id);
|
void us_ticker_insert_event(ticker_event_t *obj, timestamp_t timestamp, uint32_t id);
|
||||||
void us_ticker_remove_event(ticker_event_t *obj);
|
void us_ticker_remove_event(ticker_event_t *obj);
|
||||||
|
int us_ticker_get_next_timestamp(timestamp_t *timestamp);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,9 @@ define symbol __ICFEDIT_region_NVIC_end__ = 0x1fffe0f7;
|
||||||
define symbol __ICFEDIT_region_RAM_start__ = 0x1fffe0f8;
|
define symbol __ICFEDIT_region_RAM_start__ = 0x1fffe0f8;
|
||||||
define symbol __ICFEDIT_region_RAM_end__ = 0x1fffffff;
|
define symbol __ICFEDIT_region_RAM_end__ = 0x1fffffff;
|
||||||
/*-Sizes-*/
|
/*-Sizes-*/
|
||||||
define symbol __ICFEDIT_size_cstack__ = 0x400;
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __ICFEDIT_size_heap__ = 0x800;
|
define symbol __ICFEDIT_size_cstack__ = 0x600;
|
||||||
|
define symbol __ICFEDIT_size_heap__ = 0xC00;
|
||||||
/**** End of ICF editor section. ###ICF###*/
|
/**** End of ICF editor section. ###ICF###*/
|
||||||
|
|
||||||
define symbol __region_RAM2_start__ = 0x20000000;
|
define symbol __region_RAM2_start__ = 0x20000000;
|
||||||
|
|
|
||||||
|
|
@ -7,12 +7,13 @@ define symbol __ICFEDIT_intvec_start__ = 0x00000000;
|
||||||
define symbol __ICFEDIT_region_ROM_start__ = 0x00000000;
|
define symbol __ICFEDIT_region_ROM_start__ = 0x00000000;
|
||||||
define symbol __ICFEDIT_region_ROM_end__ = 0x0007ffff;
|
define symbol __ICFEDIT_region_ROM_end__ = 0x0007ffff;
|
||||||
define symbol __ICFEDIT_region_NVIC_start__ = 0x1fff0000;
|
define symbol __ICFEDIT_region_NVIC_start__ = 0x1fff0000;
|
||||||
define symbol __ICFEDIT_region_NVIC_end__ = 0x1fff0197;
|
define symbol __ICFEDIT_region_NVIC_end__ = 0x1fff03ff;
|
||||||
define symbol __ICFEDIT_region_RAM_start__ = 0x1fff0198;
|
define symbol __ICFEDIT_region_RAM_start__ = 0x1fff0400;
|
||||||
define symbol __ICFEDIT_region_RAM_end__ = 0x1fffffff;
|
define symbol __ICFEDIT_region_RAM_end__ = 0x1fffffff;
|
||||||
/*-Sizes-*/
|
/*-Sizes-*/
|
||||||
define symbol __ICFEDIT_size_cstack__ = 0x2000;
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __ICFEDIT_size_heap__ = 0x4000;
|
define symbol __ICFEDIT_size_cstack__ = 0x4000;
|
||||||
|
define symbol __ICFEDIT_size_heap__ = 0x8000;
|
||||||
/**** End of ICF editor section. ###ICF###*/
|
/**** End of ICF editor section. ###ICF###*/
|
||||||
|
|
||||||
define symbol __region_RAM2_start__ = 0x20000000;
|
define symbol __region_RAM2_start__ = 0x20000000;
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,9 @@ define symbol __ICFEDIT_region_NVIC_end__ = 0x1ffffcbf;
|
||||||
define symbol __ICFEDIT_region_RAM_start__ = 0x1ffffcc0;
|
define symbol __ICFEDIT_region_RAM_start__ = 0x1ffffcc0;
|
||||||
define symbol __ICFEDIT_region_RAM_end__ = 0x1fffffff;
|
define symbol __ICFEDIT_region_RAM_end__ = 0x1fffffff;
|
||||||
/*-Sizes-*/
|
/*-Sizes-*/
|
||||||
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __ICFEDIT_size_cstack__ = 0x200;
|
define symbol __ICFEDIT_size_cstack__ = 0x200;
|
||||||
define symbol __ICFEDIT_size_heap__ = 0x200;
|
define symbol __ICFEDIT_size_heap__ = 0x400;
|
||||||
/**** End of ICF editor section. ###ICF###*/
|
/**** End of ICF editor section. ###ICF###*/
|
||||||
|
|
||||||
define symbol __region_RAM2_start__ = 0x20000000;
|
define symbol __region_RAM2_start__ = 0x20000000;
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,9 @@ define symbol __ICFEDIT_region_NVIC_end__ = 0x1ffff0bf;
|
||||||
define symbol __ICFEDIT_region_RAM_start__ = 0x1ffff0c0;
|
define symbol __ICFEDIT_region_RAM_start__ = 0x1ffff0c0;
|
||||||
define symbol __ICFEDIT_region_RAM_end__ = 0x1fffffff;
|
define symbol __ICFEDIT_region_RAM_end__ = 0x1fffffff;
|
||||||
/*-Sizes-*/
|
/*-Sizes-*/
|
||||||
define symbol __ICFEDIT_size_cstack__ = 0x400;
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __ICFEDIT_size_heap__ = 0xA00;
|
define symbol __ICFEDIT_size_cstack__ = 0x800;
|
||||||
|
define symbol __ICFEDIT_size_heap__ = 0x1000;
|
||||||
/**** End of ICF editor section. ###ICF###*/
|
/**** End of ICF editor section. ###ICF###*/
|
||||||
|
|
||||||
define symbol __region_RAM2_start__ = 0x20000000;
|
define symbol __region_RAM2_start__ = 0x20000000;
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,9 @@ define symbol __ICFEDIT_region_NVIC_end__ = 0x1fffe0bf;
|
||||||
define symbol __ICFEDIT_region_RAM_start__ = 0x1fffe0c0;
|
define symbol __ICFEDIT_region_RAM_start__ = 0x1fffe0c0;
|
||||||
define symbol __ICFEDIT_region_RAM_end__ = 0x1fffffff;
|
define symbol __ICFEDIT_region_RAM_end__ = 0x1fffffff;
|
||||||
/*-Sizes-*/
|
/*-Sizes-*/
|
||||||
define symbol __ICFEDIT_size_cstack__ = 0x800;
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __ICFEDIT_size_heap__ = 0x1000;
|
define symbol __ICFEDIT_size_cstack__ = 0x1000;
|
||||||
|
define symbol __ICFEDIT_size_heap__ = 0x2000;
|
||||||
/**** End of ICF editor section. ###ICF###*/
|
/**** End of ICF editor section. ###ICF###*/
|
||||||
|
|
||||||
define symbol __region_RAM2_start__ = 0x20000000;
|
define symbol __region_RAM2_start__ = 0x20000000;
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,9 @@ define symbol __ICFEDIT_region_NVIC_end__ = 0x1fff0197;
|
||||||
define symbol __ICFEDIT_region_RAM_start__ = 0x1fff0198;
|
define symbol __ICFEDIT_region_RAM_start__ = 0x1fff0198;
|
||||||
define symbol __ICFEDIT_region_RAM_end__ = 0x1fffffff;
|
define symbol __ICFEDIT_region_RAM_end__ = 0x1fffffff;
|
||||||
/*-Sizes-*/
|
/*-Sizes-*/
|
||||||
define symbol __ICFEDIT_size_cstack__ = 0x2000;
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __ICFEDIT_size_heap__ = 0x4000;
|
define symbol __ICFEDIT_size_cstack__ = 0x8000;
|
||||||
|
define symbol __ICFEDIT_size_heap__ = 0x10000;
|
||||||
/**** End of ICF editor section. ###ICF###*/
|
/**** End of ICF editor section. ###ICF###*/
|
||||||
|
|
||||||
define symbol __region_RAM2_start__ = 0x20000000;
|
define symbol __region_RAM2_start__ = 0x20000000;
|
||||||
|
|
|
||||||
|
|
@ -138,160 +138,7 @@ __vector_table
|
||||||
DCD ENET_Transmit_IRQHandler ; Ethernet MAC Transmit Interrupt
|
DCD ENET_Transmit_IRQHandler ; Ethernet MAC Transmit Interrupt
|
||||||
DCD ENET_Receive_IRQHandler ; Ethernet MAC Receive Interrupt
|
DCD ENET_Receive_IRQHandler ; Ethernet MAC Receive Interrupt
|
||||||
DCD ENET_Error_IRQHandler ; Ethernet MAC Error and miscelaneous Interrupt
|
DCD ENET_Error_IRQHandler ; Ethernet MAC Error and miscelaneous Interrupt
|
||||||
DCD Default_Handler ; 102
|
|
||||||
DCD Default_Handler ; 103
|
|
||||||
DCD Default_Handler ; 104
|
|
||||||
DCD Default_Handler ; 105
|
|
||||||
DCD Default_Handler ; 106
|
|
||||||
DCD Default_Handler ; 107
|
|
||||||
DCD Default_Handler ; 108
|
|
||||||
DCD Default_Handler ; 109
|
|
||||||
DCD Default_Handler ; 110
|
|
||||||
DCD Default_Handler ; 111
|
|
||||||
DCD Default_Handler ; 112
|
|
||||||
DCD Default_Handler ; 113
|
|
||||||
DCD Default_Handler ; 114
|
|
||||||
DCD Default_Handler ; 115
|
|
||||||
DCD Default_Handler ; 116
|
|
||||||
DCD Default_Handler ; 117
|
|
||||||
DCD Default_Handler ; 118
|
|
||||||
DCD Default_Handler ; 119
|
|
||||||
DCD Default_Handler ; 120
|
|
||||||
DCD Default_Handler ; 121
|
|
||||||
DCD Default_Handler ; 122
|
|
||||||
DCD Default_Handler ; 123
|
|
||||||
DCD Default_Handler ; 124
|
|
||||||
DCD Default_Handler ; 125
|
|
||||||
DCD Default_Handler ; 126
|
|
||||||
DCD Default_Handler ; 127
|
|
||||||
DCD Default_Handler ; 128
|
|
||||||
DCD Default_Handler ; 129
|
|
||||||
DCD Default_Handler ; 130
|
|
||||||
DCD Default_Handler ; 131
|
|
||||||
DCD Default_Handler ; 132
|
|
||||||
DCD Default_Handler ; 133
|
|
||||||
DCD Default_Handler ; 134
|
|
||||||
DCD Default_Handler ; 135
|
|
||||||
DCD Default_Handler ; 136
|
|
||||||
DCD Default_Handler ; 137
|
|
||||||
DCD Default_Handler ; 138
|
|
||||||
DCD Default_Handler ; 139
|
|
||||||
DCD Default_Handler ; 140
|
|
||||||
DCD Default_Handler ; 141
|
|
||||||
DCD Default_Handler ; 142
|
|
||||||
DCD Default_Handler ; 143
|
|
||||||
DCD Default_Handler ; 144
|
|
||||||
DCD Default_Handler ; 145
|
|
||||||
DCD Default_Handler ; 146
|
|
||||||
DCD Default_Handler ; 147
|
|
||||||
DCD Default_Handler ; 148
|
|
||||||
DCD Default_Handler ; 149
|
|
||||||
DCD Default_Handler ; 150
|
|
||||||
DCD Default_Handler ; 151
|
|
||||||
DCD Default_Handler ; 152
|
|
||||||
DCD Default_Handler ; 153
|
|
||||||
DCD Default_Handler ; 154
|
|
||||||
DCD Default_Handler ; 155
|
|
||||||
DCD Default_Handler ; 156
|
|
||||||
DCD Default_Handler ; 157
|
|
||||||
DCD Default_Handler ; 158
|
|
||||||
DCD Default_Handler ; 159
|
|
||||||
DCD Default_Handler ; 160
|
|
||||||
DCD Default_Handler ; 161
|
|
||||||
DCD Default_Handler ; 162
|
|
||||||
DCD Default_Handler ; 163
|
|
||||||
DCD Default_Handler ; 164
|
|
||||||
DCD Default_Handler ; 165
|
|
||||||
DCD Default_Handler ; 166
|
|
||||||
DCD Default_Handler ; 167
|
|
||||||
DCD Default_Handler ; 168
|
|
||||||
DCD Default_Handler ; 169
|
|
||||||
DCD Default_Handler ; 170
|
|
||||||
DCD Default_Handler ; 171
|
|
||||||
DCD Default_Handler ; 172
|
|
||||||
DCD Default_Handler ; 173
|
|
||||||
DCD Default_Handler ; 174
|
|
||||||
DCD Default_Handler ; 175
|
|
||||||
DCD Default_Handler ; 176
|
|
||||||
DCD Default_Handler ; 177
|
|
||||||
DCD Default_Handler ; 178
|
|
||||||
DCD Default_Handler ; 179
|
|
||||||
DCD Default_Handler ; 180
|
|
||||||
DCD Default_Handler ; 181
|
|
||||||
DCD Default_Handler ; 182
|
|
||||||
DCD Default_Handler ; 183
|
|
||||||
DCD Default_Handler ; 184
|
|
||||||
DCD Default_Handler ; 185
|
|
||||||
DCD Default_Handler ; 186
|
|
||||||
DCD Default_Handler ; 187
|
|
||||||
DCD Default_Handler ; 188
|
|
||||||
DCD Default_Handler ; 189
|
|
||||||
DCD Default_Handler ; 190
|
|
||||||
DCD Default_Handler ; 191
|
|
||||||
DCD Default_Handler ; 192
|
|
||||||
DCD Default_Handler ; 193
|
|
||||||
DCD Default_Handler ; 194
|
|
||||||
DCD Default_Handler ; 195
|
|
||||||
DCD Default_Handler ; 196
|
|
||||||
DCD Default_Handler ; 197
|
|
||||||
DCD Default_Handler ; 198
|
|
||||||
DCD Default_Handler ; 199
|
|
||||||
DCD Default_Handler ; 200
|
|
||||||
DCD Default_Handler ; 201
|
|
||||||
DCD Default_Handler ; 202
|
|
||||||
DCD Default_Handler ; 203
|
|
||||||
DCD Default_Handler ; 204
|
|
||||||
DCD Default_Handler ; 205
|
|
||||||
DCD Default_Handler ; 206
|
|
||||||
DCD Default_Handler ; 207
|
|
||||||
DCD Default_Handler ; 208
|
|
||||||
DCD Default_Handler ; 209
|
|
||||||
DCD Default_Handler ; 210
|
|
||||||
DCD Default_Handler ; 211
|
|
||||||
DCD Default_Handler ; 212
|
|
||||||
DCD Default_Handler ; 213
|
|
||||||
DCD Default_Handler ; 214
|
|
||||||
DCD Default_Handler ; 215
|
|
||||||
DCD Default_Handler ; 216
|
|
||||||
DCD Default_Handler ; 217
|
|
||||||
DCD Default_Handler ; 218
|
|
||||||
DCD Default_Handler ; 219
|
|
||||||
DCD Default_Handler ; 220
|
|
||||||
DCD Default_Handler ; 221
|
|
||||||
DCD Default_Handler ; 222
|
|
||||||
DCD Default_Handler ; 223
|
|
||||||
DCD Default_Handler ; 224
|
|
||||||
DCD Default_Handler ; 225
|
|
||||||
DCD Default_Handler ; 226
|
|
||||||
DCD Default_Handler ; 227
|
|
||||||
DCD Default_Handler ; 228
|
|
||||||
DCD Default_Handler ; 229
|
|
||||||
DCD Default_Handler ; 230
|
|
||||||
DCD Default_Handler ; 231
|
|
||||||
DCD Default_Handler ; 232
|
|
||||||
DCD Default_Handler ; 233
|
|
||||||
DCD Default_Handler ; 234
|
|
||||||
DCD Default_Handler ; 235
|
|
||||||
DCD Default_Handler ; 236
|
|
||||||
DCD Default_Handler ; 237
|
|
||||||
DCD Default_Handler ; 238
|
|
||||||
DCD Default_Handler ; 239
|
|
||||||
DCD Default_Handler ; 240
|
|
||||||
DCD Default_Handler ; 241
|
|
||||||
DCD Default_Handler ; 242
|
|
||||||
DCD Default_Handler ; 243
|
|
||||||
DCD Default_Handler ; 244
|
|
||||||
DCD Default_Handler ; 245
|
|
||||||
DCD Default_Handler ; 246
|
|
||||||
DCD Default_Handler ; 247
|
|
||||||
DCD Default_Handler ; 248
|
|
||||||
DCD Default_Handler ; 249
|
|
||||||
DCD Default_Handler ; 250
|
|
||||||
DCD Default_Handler ; 251
|
|
||||||
DCD Default_Handler ; 252
|
|
||||||
DCD Default_Handler ; 253
|
|
||||||
DCD Default_Handler ; 254
|
|
||||||
DCD Default_Handler ; 255
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;;Flash Configuration
|
;;Flash Configuration
|
||||||
;;16-byte flash configuration field that stores default protection settings (loaded on reset)
|
;;16-byte flash configuration field that stores default protection settings (loaded on reset)
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
; *(InRoot$$Sections)
|
; *(InRoot$$Sections)
|
||||||
; .ANY (+RO)
|
; .ANY (+RO)
|
||||||
; }
|
; }
|
||||||
; RW_IRAM1 0x20000000 0x00004000 {
|
; RW_IRAM1 0x20000000 0x00008000 {
|
||||||
; .ANY (+RW +ZI)
|
; .ANY (+RW +ZI)
|
||||||
; }
|
; }
|
||||||
;}
|
;}
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,9 @@ define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF;
|
||||||
define symbol __ICFEDIT_region_RAM_start__ = 0x20002000;
|
define symbol __ICFEDIT_region_RAM_start__ = 0x20002000;
|
||||||
define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF;
|
define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF;
|
||||||
/*-Sizes-*/
|
/*-Sizes-*/
|
||||||
define symbol __ICFEDIT_size_cstack__ = 0x1000;
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __ICFEDIT_size_heap__ = 0x1000;
|
define symbol __ICFEDIT_size_cstack__ = 0xc00;
|
||||||
|
define symbol __ICFEDIT_size_heap__ = 0x1800;
|
||||||
/**** End of ICF editor section. ###ICF###*/
|
/**** End of ICF editor section. ###ICF###*/
|
||||||
|
|
||||||
define symbol __code_start_soft_device__ = 0x0;
|
define symbol __code_start_soft_device__ = 0x0;
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,9 @@ define symbol __ICFEDIT_region_NVIC_end__ = 0x100000FF;
|
||||||
define symbol __ICFEDIT_region_RAM_start__ = 0x10000100;
|
define symbol __ICFEDIT_region_RAM_start__ = 0x10000100;
|
||||||
define symbol __ICFEDIT_region_RAM_end__ = 0x10007FDF;
|
define symbol __ICFEDIT_region_RAM_end__ = 0x10007FDF;
|
||||||
/*-Sizes-*/
|
/*-Sizes-*/
|
||||||
define symbol __ICFEDIT_size_cstack__ = 0x400;
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __ICFEDIT_size_heap__ = 0x800;
|
define symbol __ICFEDIT_size_cstack__ = 0x1000;
|
||||||
|
define symbol __ICFEDIT_size_heap__ = 0x2000;
|
||||||
/**** End of ICF editor section. ###ICF###*/
|
/**** End of ICF editor section. ###ICF###*/
|
||||||
|
|
||||||
define symbol __CRP_start__ = 0x000002FC;
|
define symbol __CRP_start__ = 0x000002FC;
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ define symbol __ICFEDIT_region_NVIC_end__ = 0x100000BF;
|
||||||
define symbol __ICFEDIT_region_RAM_start__ = 0x100000C0;
|
define symbol __ICFEDIT_region_RAM_start__ = 0x100000C0;
|
||||||
define symbol __ICFEDIT_region_RAM_end__ = 0x10001FDF;
|
define symbol __ICFEDIT_region_RAM_end__ = 0x10001FDF;
|
||||||
/*-Sizes-*/
|
/*-Sizes-*/
|
||||||
define symbol __ICFEDIT_size_cstack__ = 0x800;
|
define symbol __ICFEDIT_size_cstack__ = 0x400;
|
||||||
define symbol __ICFEDIT_size_heap__ = 0x800;
|
define symbol __ICFEDIT_size_heap__ = 0x800;
|
||||||
/**** End of ICF editor section. ###ICF###*/
|
/**** End of ICF editor section. ###ICF###*/
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,9 @@ define symbol __ICFEDIT_region_NVIC_end__ = 0x020000FF;
|
||||||
define symbol __ICFEDIT_region_RAM_start__ = 0x02000100;
|
define symbol __ICFEDIT_region_RAM_start__ = 0x02000100;
|
||||||
define symbol __ICFEDIT_region_RAM_end__ = 0x02008FDF;
|
define symbol __ICFEDIT_region_RAM_end__ = 0x02008FDF;
|
||||||
/*-Sizes-*/
|
/*-Sizes-*/
|
||||||
define symbol __ICFEDIT_size_cstack__ = 0x1000;
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __ICFEDIT_size_heap__ = 0x2000;
|
define symbol __ICFEDIT_size_cstack__ = 0x1200;
|
||||||
|
define symbol __ICFEDIT_size_heap__ = 0x2400;
|
||||||
/**** End of ICF editor section. ###ICF###*/
|
/**** End of ICF editor section. ###ICF###*/
|
||||||
|
|
||||||
define symbol __CRP_start__ = 0x000002FC;
|
define symbol __CRP_start__ = 0x000002FC;
|
||||||
|
|
|
||||||
|
|
@ -12,8 +12,9 @@ define symbol __ICFEDIT_region_RAM_start__ = 0x100000C8;
|
||||||
define symbol __ICFEDIT_region_RAM_end__ = 0x10007FDF;
|
define symbol __ICFEDIT_region_RAM_end__ = 0x10007FDF;
|
||||||
|
|
||||||
/*-Sizes-*/
|
/*-Sizes-*/
|
||||||
define symbol __ICFEDIT_size_cstack__ = 0x800;
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __ICFEDIT_size_heap__ = 0x1000;
|
define symbol __ICFEDIT_size_cstack__ = 0x1000;
|
||||||
|
define symbol __ICFEDIT_size_heap__ = 0x2000;
|
||||||
/**** End of ICF editor section. ###ICF###*/
|
/**** End of ICF editor section. ###ICF###*/
|
||||||
|
|
||||||
define symbol __CRP_start__ = 0x000002FC;
|
define symbol __CRP_start__ = 0x000002FC;
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,9 @@ define symbol __ICFEDIT_region_NVIC_end__ = 0x100000E7;
|
||||||
define symbol __ICFEDIT_region_RAM_start__ = 0x100000E8;
|
define symbol __ICFEDIT_region_RAM_start__ = 0x100000E8;
|
||||||
define symbol __ICFEDIT_region_RAM_end__ = 0x1000FFDF;
|
define symbol __ICFEDIT_region_RAM_end__ = 0x1000FFDF;
|
||||||
/*-Sizes-*/
|
/*-Sizes-*/
|
||||||
define symbol __ICFEDIT_size_cstack__ = 0x800;
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __ICFEDIT_size_heap__ = 0x1000;
|
define symbol __ICFEDIT_size_cstack__ = 0x2000;
|
||||||
|
define symbol __ICFEDIT_size_heap__ = 0x4000;
|
||||||
/**** End of ICF editor section. ###ICF###*/
|
/**** End of ICF editor section. ###ICF###*/
|
||||||
|
|
||||||
define symbol __CRP_start__ = 0x000002FC;
|
define symbol __CRP_start__ = 0x000002FC;
|
||||||
|
|
|
||||||
|
|
@ -20,8 +20,9 @@ define region RAM_region = mem:[from __region_RAM_start__ to __region_RAM_
|
||||||
define region AHB_RAM_region = mem:[from _AHB_RAM_start__ to _AHB_RAM_end__];
|
define region AHB_RAM_region = mem:[from _AHB_RAM_start__ to _AHB_RAM_end__];
|
||||||
|
|
||||||
/* Stack and Heap */
|
/* Stack and Heap */
|
||||||
define symbol __size_cstack__ = 0x800;
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __size_heap__ = 0x800;
|
define symbol __size_cstack__ = 0x4000;
|
||||||
|
define symbol __size_heap__ = 0x8000;
|
||||||
define block CSTACK with alignment = 8, size = __size_cstack__ { };
|
define block CSTACK with alignment = 8, size = __size_cstack__ { };
|
||||||
define block HEAP with alignment = 8, size = __size_heap__ { };
|
define block HEAP with alignment = 8, size = __size_heap__ { };
|
||||||
define block STACKHEAP with fixed order { block HEAP, block CSTACK };
|
define block STACKHEAP with fixed order { block HEAP, block CSTACK };
|
||||||
|
|
|
||||||
|
|
@ -368,23 +368,46 @@ typedef struct { /*!< (@ 0x40028000) WKT Structure
|
||||||
} LPC_WKT_TypeDef;
|
} LPC_WKT_TypeDef;
|
||||||
/*@}*/ /* end of group LPC8xx_WKT */
|
/*@}*/ /* end of group LPC8xx_WKT */
|
||||||
|
|
||||||
|
|
||||||
/*------------- Multi-Rate Timer(MRT) --------------------------------------------------*/
|
/*------------- Multi-Rate Timer(MRT) --------------------------------------------------*/
|
||||||
typedef struct {
|
//New, Copied from lpc824
|
||||||
__IO uint32_t INTVAL;
|
/**
|
||||||
__IO uint32_t TIMER;
|
* @brief Multi-Rate Timer (MRT) (MRT)
|
||||||
__IO uint32_t CTRL;
|
*/
|
||||||
__IO uint32_t STAT;
|
typedef struct { /*!< (@ 0x40004000) MRT Structure */
|
||||||
} MRT_Channel_cfg_Type;
|
__IO uint32_t INTVAL0; /*!< (@ 0x40004000) MRT0 Time interval value register. This value
|
||||||
|
is loaded into the TIMER0 register. */
|
||||||
typedef struct {
|
__I uint32_t TIMER0; /*!< (@ 0x40004004) MRT0 Timer register. This register reads the
|
||||||
MRT_Channel_cfg_Type Channel[4];
|
value of the down-counter. */
|
||||||
uint32_t Reserved0[1];
|
__IO uint32_t CTRL0; /*!< (@ 0x40004008) MRT0 Control register. This register controls
|
||||||
__IO uint32_t IDLE_CH;
|
the MRT0 modes. */
|
||||||
__IO uint32_t IRQ_FLAG;
|
__IO uint32_t STAT0; /*!< (@ 0x4000400C) MRT0 Status register. */
|
||||||
|
__IO uint32_t INTVAL1; /*!< (@ 0x40004010) MRT0 Time interval value register. This value
|
||||||
|
is loaded into the TIMER0 register. */
|
||||||
|
__I uint32_t TIMER1; /*!< (@ 0x40004014) MRT0 Timer register. This register reads the
|
||||||
|
value of the down-counter. */
|
||||||
|
__IO uint32_t CTRL1; /*!< (@ 0x40004018) MRT0 Control register. This register controls
|
||||||
|
the MRT0 modes. */
|
||||||
|
__IO uint32_t STAT1; /*!< (@ 0x4000401C) MRT0 Status register. */
|
||||||
|
__IO uint32_t INTVAL2; /*!< (@ 0x40004020) MRT0 Time interval value register. This value
|
||||||
|
is loaded into the TIMER0 register. */
|
||||||
|
__I uint32_t TIMER2; /*!< (@ 0x40004024) MRT0 Timer register. This register reads the
|
||||||
|
value of the down-counter. */
|
||||||
|
__IO uint32_t CTRL2; /*!< (@ 0x40004028) MRT0 Control register. This register controls
|
||||||
|
the MRT0 modes. */
|
||||||
|
__IO uint32_t STAT2; /*!< (@ 0x4000402C) MRT0 Status register. */
|
||||||
|
__IO uint32_t INTVAL3; /*!< (@ 0x40004030) MRT0 Time interval value register. This value
|
||||||
|
is loaded into the TIMER0 register. */
|
||||||
|
__I uint32_t TIMER3; /*!< (@ 0x40004034) MRT0 Timer register. This register reads the
|
||||||
|
value of the down-counter. */
|
||||||
|
__IO uint32_t CTRL3; /*!< (@ 0x40004038) MRT0 Control register. This register controls
|
||||||
|
the MRT0 modes. */
|
||||||
|
__IO uint32_t STAT3; /*!< (@ 0x4000403C) MRT0 Status register. */
|
||||||
|
__I uint32_t RESERVED0[45];
|
||||||
|
__I uint32_t IDLE_CH; /*!< (@ 0x400040F4) Idle channel register. This register returns
|
||||||
|
the number of the first idle channel. */
|
||||||
|
__IO uint32_t IRQ_FLAG; /*!< (@ 0x400040F8) Global interrupt flag register */
|
||||||
} LPC_MRT_TypeDef;
|
} LPC_MRT_TypeDef;
|
||||||
|
|
||||||
|
|
||||||
/*------------- Universal Asynchronous Receiver Transmitter (USART) -----------*/
|
/*------------- Universal Asynchronous Receiver Transmitter (USART) -----------*/
|
||||||
/** @addtogroup LPC8xx_UART LPC8xx Universal Asynchronous Receiver/Transmitter
|
/** @addtogroup LPC8xx_UART LPC8xx Universal Asynchronous Receiver/Transmitter
|
||||||
@{
|
@{
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ define symbol __ICFEDIT_region_RAM_start__ = 0x100000C0;
|
||||||
define symbol __ICFEDIT_region_RAM_end__ = 0x100003FF;
|
define symbol __ICFEDIT_region_RAM_end__ = 0x100003FF;
|
||||||
/*-Sizes-*/
|
/*-Sizes-*/
|
||||||
define symbol __ICFEDIT_size_cstack__ = 0x100;
|
define symbol __ICFEDIT_size_cstack__ = 0x100;
|
||||||
define symbol __ICFEDIT_size_heap__ = 0x100;
|
define symbol __ICFEDIT_size_heap__ = 0x200;
|
||||||
/**** End of ICF editor section. ###ICF###*/
|
/**** End of ICF editor section. ###ICF###*/
|
||||||
|
|
||||||
define symbol __CRP_start__ = 0x000002FC;
|
define symbol __CRP_start__ = 0x000002FC;
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,8 @@ define symbol __ICFEDIT_region_NVIC_end__ = 0x100000BF;
|
||||||
define symbol __ICFEDIT_region_RAM_start__ = 0x100000C0;
|
define symbol __ICFEDIT_region_RAM_start__ = 0x100000C0;
|
||||||
define symbol __ICFEDIT_region_RAM_end__ = 0x10000FFF;
|
define symbol __ICFEDIT_region_RAM_end__ = 0x10000FFF;
|
||||||
/*-Sizes-*/
|
/*-Sizes-*/
|
||||||
define symbol __ICFEDIT_size_cstack__ = 0x200;
|
define symbol __ICFEDIT_size_cstack__ = 0x400;
|
||||||
define symbol __ICFEDIT_size_heap__ = 0x400;
|
define symbol __ICFEDIT_size_heap__ = 0x800;
|
||||||
/**** End of ICF editor section. ###ICF###*/
|
/**** End of ICF editor section. ###ICF###*/
|
||||||
|
|
||||||
define symbol __CRP_start__ = 0x000002FC;
|
define symbol __CRP_start__ = 0x000002FC;
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,14 @@
|
||||||
/* Linker script for mbed LPC1768 */
|
/* Linker script for mbed RZ_A1H */
|
||||||
|
|
||||||
/* Linker script to configure memory regions. */
|
/* Linker script to configure memory regions. */
|
||||||
MEMORY
|
MEMORY
|
||||||
{
|
{
|
||||||
FLASH (rx) : ORIGIN = 0x20000000, LENGTH = 512K
|
ROM (rx) : ORIGIN = 0x00000000, LENGTH = 0x02000000
|
||||||
RAM (rwx) : ORIGIN = 0x20080000, LENGTH = (1M)
|
BOOT_LOADER (rx) : ORIGIN = 0x18000000, LENGTH = 0x00004000
|
||||||
|
SFLASH (rx) : ORIGIN = 0x18004000, LENGTH = 0x07FFC000
|
||||||
USB_RAM(rwx) : ORIGIN = 0x20180000, LENGTH = 16K
|
L_TTB (rw) : ORIGIN = 0x20000000, LENGTH = 0x00004000
|
||||||
ETH_RAM(rwx) : ORIGIN = 0x20280000, LENGTH = 16K
|
RAM (rwx) : ORIGIN = 0x20020000, LENGTH = 0x00700000
|
||||||
|
RAM_NC (rwx) : ORIGIN = 0x20900000, LENGTH = 0x00100000
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Linker script to place sections and symbol values. Should be used together
|
/* Linker script to place sections and symbol values. Should be used together
|
||||||
|
|
@ -40,9 +41,21 @@ ENTRY(Reset_Handler)
|
||||||
|
|
||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
|
.boot :
|
||||||
|
{
|
||||||
|
KEEP(*(.boot_loader))
|
||||||
|
} > BOOT_LOADER
|
||||||
|
|
||||||
.text :
|
.text :
|
||||||
{
|
{
|
||||||
|
|
||||||
|
Image$$VECTORS$$Base = .;
|
||||||
|
* (RESET)
|
||||||
|
Image$$VECTORS$$Limit = .;
|
||||||
|
. += 0x00000400;
|
||||||
|
|
||||||
KEEP(*(.isr_vector))
|
KEEP(*(.isr_vector))
|
||||||
|
*(SVC_TABLE)
|
||||||
*(.text*)
|
*(.text*)
|
||||||
|
|
||||||
KEEP(*(.init))
|
KEEP(*(.init))
|
||||||
|
|
@ -62,31 +75,66 @@ SECTIONS
|
||||||
*(SORT(.dtors.*))
|
*(SORT(.dtors.*))
|
||||||
*(.dtors)
|
*(.dtors)
|
||||||
|
|
||||||
|
Image$$RO_DATA$$Base = .;
|
||||||
*(.rodata*)
|
*(.rodata*)
|
||||||
|
Image$$RO_DATA$$Limit = .;
|
||||||
|
|
||||||
KEEP(*(.eh_frame*))
|
KEEP(*(.eh_frame*))
|
||||||
} > FLASH
|
} > SFLASH
|
||||||
|
|
||||||
.ARM.extab :
|
.ARM.extab :
|
||||||
{
|
{
|
||||||
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
||||||
} > FLASH
|
} > SFLASH
|
||||||
|
|
||||||
__exidx_start = .;
|
__exidx_start = .;
|
||||||
.ARM.exidx :
|
.ARM.exidx :
|
||||||
{
|
{
|
||||||
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
||||||
} > FLASH
|
} > SFLASH
|
||||||
__exidx_end = .;
|
__exidx_end = .;
|
||||||
|
|
||||||
|
|
||||||
|
.copy.table :
|
||||||
|
{
|
||||||
|
. = ALIGN(4);
|
||||||
|
__copy_table_start__ = .;
|
||||||
|
LONG (__etext)
|
||||||
|
LONG (__data_start__)
|
||||||
|
LONG (__data_end__ - __data_start__)
|
||||||
|
LONG (__etext2)
|
||||||
|
LONG (__nc_data_start)
|
||||||
|
LONG (__nc_data_end - __nc_data_start)
|
||||||
|
__copy_table_end__ = .;
|
||||||
|
} > SFLASH
|
||||||
|
|
||||||
|
.zero.table :
|
||||||
|
{
|
||||||
|
. = ALIGN(4);
|
||||||
|
__zero_table_start__ = .;
|
||||||
|
LONG (__bss_start__)
|
||||||
|
LONG (__bss_end__ - __bss_start__)
|
||||||
|
LONG (__nc_bss_start)
|
||||||
|
LONG (__nc_bss_end - __nc_bss_start)
|
||||||
|
__zero_table_end__ = .;
|
||||||
|
} > SFLASH
|
||||||
|
|
||||||
__etext = .;
|
__etext = .;
|
||||||
|
|
||||||
|
.ttb :
|
||||||
|
{
|
||||||
|
Image$$TTB$$ZI$$Base = .;
|
||||||
|
. += 0x00004000;
|
||||||
|
Image$$TTB$$ZI$$Limit = .;
|
||||||
|
} > L_TTB
|
||||||
|
|
||||||
.data : AT (__etext)
|
.data : AT (__etext)
|
||||||
{
|
{
|
||||||
|
Image$$RW_DATA$$Base = .;
|
||||||
__data_start__ = .;
|
__data_start__ = .;
|
||||||
Image$$RW_RAM1$$Base = .;
|
|
||||||
*(vtable)
|
*(vtable)
|
||||||
*(.data*)
|
*(.data*)
|
||||||
|
Image$$RW_DATA$$Limit = .;
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
/* preinit data */
|
/* preinit data */
|
||||||
|
|
@ -116,13 +164,14 @@ SECTIONS
|
||||||
} > RAM
|
} > RAM
|
||||||
|
|
||||||
|
|
||||||
.bss :
|
.bss ALIGN(0x400):
|
||||||
{
|
{
|
||||||
|
Image$$ZI_DATA$$Base = .;
|
||||||
__bss_start__ = .;
|
__bss_start__ = .;
|
||||||
*(.bss*)
|
*(.bss*)
|
||||||
*(COMMON)
|
*(COMMON)
|
||||||
__bss_end__ = .;
|
__bss_end__ = .;
|
||||||
Image$$RW_RAM1$$ZI$$Limit = . ;
|
Image$$ZI_DATA$$Limit = .;
|
||||||
} > RAM
|
} > RAM
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -142,6 +191,29 @@ SECTIONS
|
||||||
*(.stack)
|
*(.stack)
|
||||||
} > RAM
|
} > RAM
|
||||||
|
|
||||||
|
__etext2 = __etext + SIZEOF(.data);
|
||||||
|
.nc_data : AT (__etext2)
|
||||||
|
{
|
||||||
|
Image$$RW_DATA_NC$$Base = .;
|
||||||
|
__nc_data_start = .;
|
||||||
|
*(NC_DATA)
|
||||||
|
|
||||||
|
. = ALIGN(4);
|
||||||
|
__nc_data_end = .;
|
||||||
|
Image$$RW_DATA_NC$$Limit = .;
|
||||||
|
} > RAM_NC
|
||||||
|
|
||||||
|
.nc_bss (NOLOAD) :
|
||||||
|
{
|
||||||
|
Image$$ZI_DATA_NC$$Base = .;
|
||||||
|
__nc_bss_start = .;
|
||||||
|
*(NC_BSS)
|
||||||
|
|
||||||
|
. = ALIGN(4);
|
||||||
|
__nc_bss_end = .;
|
||||||
|
Image$$ZI_DATA_NC$$Limit = .;
|
||||||
|
} > RAM_NC
|
||||||
|
|
||||||
/* Set stack top to end of RAM, and stack limit move down by
|
/* Set stack top to end of RAM, and stack limit move down by
|
||||||
* size of stack_dummy section */
|
* size of stack_dummy section */
|
||||||
__StackTop = ORIGIN(RAM) + LENGTH(RAM);
|
__StackTop = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
|
|
||||||
|
|
@ -1,125 +0,0 @@
|
||||||
@/*******************************************************************************
|
|
||||||
@* DISCLAIMER
|
|
||||||
@* This software is supplied by Renesas Electronics Corporation and is only
|
|
||||||
@* intended for use with Renesas products. No other uses are authorized. This
|
|
||||||
@* software is owned by Renesas Electronics Corporation and is protected under
|
|
||||||
@* all applicable laws, including copyright laws.
|
|
||||||
@* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
|
|
||||||
@* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
|
|
||||||
@* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
@* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
|
|
||||||
@* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
|
|
||||||
@* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
|
|
||||||
@* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
|
|
||||||
@* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
|
|
||||||
@* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
@* Renesas reserves the right, without notice, to make changes to this software
|
|
||||||
@* and to discontinue the availability of this software. By using this software,
|
|
||||||
@* you agree to the additional terms and conditions found by accessing the
|
|
||||||
@* following link:
|
|
||||||
@* http://www.renesas.com/disclaimer
|
|
||||||
@* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
|
|
||||||
@*******************************************************************************/
|
|
||||||
@/*******************************************************************************
|
|
||||||
@* File Name : irqfiq_handler.s
|
|
||||||
@* $Rev: 823 $
|
|
||||||
@* $Date:: 2014-04-21 16:45:10 +0900#$
|
|
||||||
@* Description : IRQ, FIQ handler
|
|
||||||
@*******************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
@ Standard definitions of mode bits and interrupt (I & F) flags in PSRs
|
|
||||||
.EQU SYS_MODE, 0x1f
|
|
||||||
|
|
||||||
@ INTC ICCIAR register address
|
|
||||||
.EQU INTC_ICCIAR_ADDR, 0xE820200C
|
|
||||||
@ INTC ICCEOIR register address
|
|
||||||
.EQU INTC_ICCEOIR_ADDR, 0xE8202010
|
|
||||||
@ INTC ICDABR0 register address
|
|
||||||
.EQU INTC_ICDABR0_ADDR, 0xE8201300
|
|
||||||
@ INTC ICDIPR0 register address
|
|
||||||
.EQU INTC_ICDIPR0_ADDR, 0xE8201400
|
|
||||||
@ INTC ICCHPIR register address
|
|
||||||
.EQU INTC_ICCHPIR_ADDR, 0xE8202018
|
|
||||||
|
|
||||||
@==================================================================
|
|
||||||
@ Entry point for the FIQ handler
|
|
||||||
@==================================================================
|
|
||||||
@ PRESERVE8
|
|
||||||
@ .section IRQ_FIQ_HANDLER, #execinstr
|
|
||||||
.text
|
|
||||||
.arm
|
|
||||||
|
|
||||||
@ IMPORT FiqHandler_Interrupt
|
|
||||||
@ IMPORT INTC_Handler_Interrupt
|
|
||||||
|
|
||||||
.global irq_handler
|
|
||||||
.global fiq_handler
|
|
||||||
|
|
||||||
|
|
||||||
@******************************************************************************
|
|
||||||
@ Function Name : fiq_handler
|
|
||||||
@ Description : This function is the assembler function executed when the FIQ
|
|
||||||
@ : interrupt is generated.
|
|
||||||
@******************************************************************************
|
|
||||||
fiq_handler:
|
|
||||||
B FiqHandler_Interrupt
|
|
||||||
|
|
||||||
|
|
||||||
@******************************************************************************
|
|
||||||
@ Function Name : irq_handler
|
|
||||||
@ Description : This function is the assembler function executed when the IRQ
|
|
||||||
@ : interrupt is generated. After saving the stack pointer and
|
|
||||||
@ : the stack for general registers and obtaining the INTC interrupt
|
|
||||||
@ : source ID, calls the IntcIrqHandler_interrupt function written
|
|
||||||
@ : in C language to execute the processing for the INTC interrupt
|
|
||||||
@ : handler corresponding to the interrupt source ID.
|
|
||||||
@ : After the INTC interrupt handler processing, restores
|
|
||||||
@ : the stack pointer and the general registers from the stack and
|
|
||||||
@ : returns from the IRQ interrupt processing.
|
|
||||||
@******************************************************************************
|
|
||||||
irq_handler:
|
|
||||||
SUB lr, lr, #4
|
|
||||||
SRSDB sp!, #SYS_MODE @;; Store LR_irq and SPSR_irq in system mode stack
|
|
||||||
CPS #SYS_MODE @;; Switch to system mode
|
|
||||||
PUSH {r0-r3, r12} @;; Store other AAPCS registers
|
|
||||||
LDR r1, =INTC_ICCHPIR_ADDR
|
|
||||||
LDR r3, [r1]
|
|
||||||
LDR r2, =INTC_ICCIAR_ADDR
|
|
||||||
LDR r0, [r2] @;; Read ICCIAR
|
|
||||||
LDR r2, =0x000003FF
|
|
||||||
AND r3, r0, r2
|
|
||||||
CMP r3, r2
|
|
||||||
BEQ end_of_handler
|
|
||||||
CMP r3, #0
|
|
||||||
BNE int_active
|
|
||||||
LDR r2, =INTC_ICDABR0_ADDR
|
|
||||||
LDR r3, [r2]
|
|
||||||
AND r3, r3, #0x00000001
|
|
||||||
CMP r3, #0
|
|
||||||
BNE int_active
|
|
||||||
LDR r2, =INTC_ICDIPR0_ADDR
|
|
||||||
LDR r3, [r2]
|
|
||||||
STR r3, [r2]
|
|
||||||
B end_of_handler
|
|
||||||
int_active:
|
|
||||||
PUSH {r0}
|
|
||||||
MOV r1, sp @;;
|
|
||||||
AND r1, r1, #4 @;; Make alignment for stack
|
|
||||||
SUB sp, sp, r1 @;;
|
|
||||||
PUSH {r1, lr}
|
|
||||||
BL INTC_Handler_Interrupt @;; First argument(r0) = ICCIAR read value
|
|
||||||
POP {r1, lr}
|
|
||||||
ADD sp, sp, r1
|
|
||||||
POP {r0}
|
|
||||||
LDR r2, =INTC_ICCEOIR_ADDR
|
|
||||||
STR r0, [r2] @;; Write ICCEOIR
|
|
||||||
end_of_handler:
|
|
||||||
POP {r0-r3, r12} @;; Restore registers
|
|
||||||
RFEIA sp! @;; Return from system mode stack using RFE
|
|
||||||
|
|
||||||
Literals3:
|
|
||||||
.LTORG
|
|
||||||
|
|
||||||
|
|
||||||
.END
|
|
||||||
|
|
@ -16,67 +16,90 @@
|
||||||
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
|
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
|
||||||
*/
|
*/
|
||||||
.syntax unified
|
.syntax unified
|
||||||
|
.extern _start
|
||||||
|
|
||||||
@ Standard definitions of mode bits and interrupt (I & F) flags in PSRs
|
@ Standard definitions of mode bits and interrupt (I & F) flags in PSRs
|
||||||
.equ USR_MODE, 0x10
|
.equ USR_MODE , 0x10
|
||||||
.equ FIQ_MODE, 0x11
|
.equ FIQ_MODE , 0x11
|
||||||
.equ IRQ_MODE, 0x12
|
.equ IRQ_MODE , 0x12
|
||||||
.equ SVC_MODE, 0x13
|
.equ SVC_MODE , 0x13
|
||||||
.equ ABT_MODE, 0x17
|
.equ ABT_MODE , 0x17
|
||||||
.equ UND_MODE, 0x1b
|
.equ UND_MODE , 0x1b
|
||||||
.equ SYS_MODE, 0x1f
|
.equ SYS_MODE , 0x1f
|
||||||
.equ Thum_bit, 0x20 @ CPSR/SPSR Thumb bit
|
.equ Thum_bit , 0x20 @ CPSR/SPSR Thumb bit
|
||||||
|
|
||||||
/* Memory Model
|
.equ GICI_BASE , 0xe8202000
|
||||||
The HEAP starts at the end of the DATA section and grows upward.
|
.equ ICCIAR_OFFSET , 0x0000000C
|
||||||
|
.equ ICCEOIR_OFFSET , 0x00000010
|
||||||
The STACK starts at the end of the RAM and grows downward.
|
.equ ICCHPIR_OFFSET , 0x00000018
|
||||||
|
.equ GICD_BASE , 0xe8201000
|
||||||
The HEAP and stack STACK are only checked at compile time:
|
.equ ICDISER0_OFFSET , 0x00000100
|
||||||
(DATA_SIZE + HEAP_SIZE + STACK_SIZE) < RAM_SIZE
|
.equ ICDICER0_OFFSET , 0x00000180
|
||||||
|
.equ ICDISPR0_OFFSET , 0x00000200
|
||||||
This is just a check for the bare minimum for the Heap+Stack area before
|
.equ ICDABR0_OFFSET , 0x00000300
|
||||||
aborting compilation, it is not the run time limit:
|
.equ ICDIPR0_OFFSET , 0x00000400
|
||||||
Heap_Size + Stack_Size = 0x80 + 0x80 = 0x100
|
|
||||||
*/
|
.equ Mode_USR , 0x10
|
||||||
|
.equ Mode_FIQ , 0x11
|
||||||
|
.equ Mode_IRQ , 0x12
|
||||||
|
.equ Mode_SVC , 0x13
|
||||||
|
.equ Mode_ABT , 0x17
|
||||||
|
.equ Mode_UND , 0x1B
|
||||||
|
.equ Mode_SYS , 0x1F
|
||||||
|
|
||||||
|
.equ I_Bit , 0x80 @ when I bit is set, IRQ is disabled
|
||||||
|
.equ F_Bit , 0x40 @ when F bit is set, FIQ is disabled
|
||||||
|
.equ T_Bit , 0x20 @ when T bit is set, core is in Thumb state
|
||||||
|
|
||||||
|
.equ GIC_ERRATA_CHECK_1, 0x000003FE
|
||||||
|
.equ GIC_ERRATA_CHECK_2, 0x000003FF
|
||||||
|
|
||||||
|
.equ Sect_Normal , 0x00005c06 @ outer & inner wb/wa, non-shareable, executable, rw, domain 0, base addr 0
|
||||||
|
.equ Sect_Normal_Cod , 0x0000dc06 @ outer & inner wb/wa, non-shareable, executable, ro, domain 0, base addr 0
|
||||||
|
.equ Sect_Normal_RO , 0x0000dc16 @ as Sect_Normal_Cod, but not executable
|
||||||
|
.equ Sect_Normal_RW , 0x00005c16 @ as Sect_Normal_Cod, but writeable and not executable
|
||||||
|
.equ Sect_SO , 0x00000c12 @ strongly-ordered (therefore shareable), not executable, rw, domain 0, base addr 0
|
||||||
|
.equ Sect_Device_RO , 0x00008c12 @ device, non-shareable, non-executable, ro, domain 0, base addr 0
|
||||||
|
.equ Sect_Device_RW , 0x00000c12 @ as Sect_Device_RO, but writeable
|
||||||
|
.equ Sect_Fault , 0x00000000 @ this translation will fault (the bottom 2 bits are important, the rest are ignored)
|
||||||
|
|
||||||
|
.equ RAM_BASE , 0x80000000
|
||||||
|
.equ VRAM_BASE , 0x18000000
|
||||||
|
.equ SRAM_BASE , 0x2e000000
|
||||||
|
.equ ETHERNET , 0x1a000000
|
||||||
|
.equ CS3_PERIPHERAL_BASE, 0x1c000000
|
||||||
|
|
||||||
|
|
||||||
|
@ Stack Configuration
|
||||||
|
|
||||||
|
.EQU UND_Stack_Size , 0x00000100
|
||||||
|
.EQU SVC_Stack_Size , 0x00008000
|
||||||
|
.EQU ABT_Stack_Size , 0x00000100
|
||||||
|
.EQU FIQ_Stack_Size , 0x00000100
|
||||||
|
.EQU IRQ_Stack_Size , 0x00008000
|
||||||
|
.EQU USR_Stack_Size , 0x00004000
|
||||||
|
|
||||||
|
.EQU ISR_Stack_Size, (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + FIQ_Stack_Size + IRQ_Stack_Size)
|
||||||
|
|
||||||
.section .stack
|
.section .stack
|
||||||
.align 3
|
.align 3
|
||||||
#ifdef __STACK_SIZE
|
|
||||||
.equ Stack_Size, __STACK_SIZE
|
|
||||||
#else
|
|
||||||
.equ Stack_Size, 0xc00
|
|
||||||
#endif
|
|
||||||
.globl __StackTop
|
.globl __StackTop
|
||||||
.globl __StackLimit
|
.globl __StackLimit
|
||||||
__StackLimit:
|
__StackLimit:
|
||||||
.space Stack_Size
|
.space ISR_Stack_Size
|
||||||
|
__initial_sp:
|
||||||
|
.space USR_Stack_Size
|
||||||
.size __StackLimit, . - __StackLimit
|
.size __StackLimit, . - __StackLimit
|
||||||
__StackTop:
|
__StackTop:
|
||||||
.size __StackTop, . - __StackTop
|
.size __StackTop, . - __StackTop
|
||||||
__AStackLimit:
|
|
||||||
.space Stack_Size
|
|
||||||
.size __AStackLimit, . - __AStackLimit
|
@ Heap Configuration
|
||||||
__AStackTop:
|
|
||||||
.size __AStackTop, . - __AStackTop
|
.EQU Heap_Size , 0x00080000
|
||||||
__BStackLimit:
|
|
||||||
.space Stack_Size
|
|
||||||
.size __BStackLimit, . - __StackLimit
|
|
||||||
__BStackTop:
|
|
||||||
.size __BStackTop, . - __BStackTop
|
|
||||||
__CStackLimit:
|
|
||||||
.space Stack_Size
|
|
||||||
.size __CStackLimit, . - __CStackLimit
|
|
||||||
__CStackTop:
|
|
||||||
.size __CStackTop, . - __CStackTop
|
|
||||||
|
|
||||||
.section .heap
|
.section .heap
|
||||||
.align 3
|
.align 3
|
||||||
#ifdef __HEAP_SIZE
|
|
||||||
.equ Heap_Size, __HEAP_SIZE
|
|
||||||
#else
|
|
||||||
.equ Heap_Size, 0x800
|
|
||||||
#endif
|
|
||||||
.globl __HeapBase
|
.globl __HeapBase
|
||||||
.globl __HeapLimit
|
.globl __HeapLimit
|
||||||
__HeapBase:
|
__HeapBase:
|
||||||
|
|
@ -84,164 +107,426 @@ __HeapBase:
|
||||||
.size __HeapBase, . - __HeapBase
|
.size __HeapBase, . - __HeapBase
|
||||||
__HeapLimit:
|
__HeapLimit:
|
||||||
.size __HeapLimit, . - __HeapLimit
|
.size __HeapLimit, . - __HeapLimit
|
||||||
|
|
||||||
|
|
||||||
.section .isr_vector
|
.section .isr_vector
|
||||||
.align 2
|
.align 2
|
||||||
.globl __isr_vector
|
.globl __isr_vector
|
||||||
__isr_vector:
|
__isr_vector:
|
||||||
.long 0xe59ff018 // 0x00
|
.long 0xe59ff018 // 0x00
|
||||||
.long 0xe59ff018 // 0x04
|
.long 0xe59ff018 // 0x04
|
||||||
.long 0xe59ff018 // 0x08
|
.long 0xe59ff018 // 0x08
|
||||||
.long 0xe59ff018 // 0x0c
|
.long 0xe59ff018 // 0x0c
|
||||||
.long 0xe59ff018 // 0x10
|
.long 0xe59ff018 // 0x10
|
||||||
.long 0xe59ff018 // 0x14
|
.long 0xe59ff018 // 0x14
|
||||||
.long 0xe59ff018 // 0x18
|
.long 0xe59ff018 // 0x18
|
||||||
.long 0xe59ff018 // 0x1c
|
.long 0xe59ff018 // 0x1c
|
||||||
|
|
||||||
.long Reset_Handler /* 0x20 */
|
.long Reset_Handler /* 0x20 */
|
||||||
.long undefinedInstruction /* 0x24 */
|
.long Undef_Handler /* 0x24 */
|
||||||
.long softwareInterrupt /* 0x28 */
|
.long SVC_Handler /* 0x28 */
|
||||||
.long prefetchAboart /* 0x2c */
|
.long PAbt_Handler /* 0x2c */
|
||||||
.long dataAbort /* 0x30 */
|
.long DAbt_Handler /* 0x30 */
|
||||||
.long 0 /* Reserved */
|
.long 0 /* Reserved */
|
||||||
.long irq_handler /* IRQ */
|
.long IRQ_Handler /* IRQ */
|
||||||
.long fiq_handler /* FIQ */
|
.long FIQ_Handler /* FIQ */
|
||||||
|
|
||||||
|
|
||||||
.size __isr_vector, . - __isr_vector
|
.size __isr_vector, . - __isr_vector
|
||||||
|
|
||||||
.text
|
.text
|
||||||
// .thumb
|
|
||||||
// .thumb_func
|
|
||||||
.align 2
|
.align 2
|
||||||
.globl Reset_Handler
|
.globl Reset_Handler
|
||||||
.type Reset_Handler, %function
|
.type Reset_Handler, %function
|
||||||
Reset_Handler:
|
Reset_Handler:
|
||||||
/* Loop to copy data from read only memory to RAM. The ranges
|
@ Put any cores other than 0 to sleep
|
||||||
* of copy from/to are specified by following symbols evaluated in
|
mrc p15, 0, r0, c0, c0, 5 @ Read MPIDR
|
||||||
* linker script.
|
ands r0, r0, #3
|
||||||
* _etext: End of code section, i.e., begin of data sections to copy from.
|
|
||||||
* __data_start__/__data_end__: RAM address range that data should be
|
|
||||||
* copied to. Both must be aligned to 4 bytes boundary. */
|
|
||||||
|
|
||||||
mrc p15, 0, r0, c1, c0, 0 @;; Read CP15 System Control register (SCTLR)
|
goToSleep:
|
||||||
bic r0, r0, #(0x1 << 12) @;; Clear I bit 12 to disable I Cache
|
wfine
|
||||||
bic r0, r0, #(0x1 << 2) @;; Clear C bit 2 to disable D Cache
|
bne goToSleep
|
||||||
bic r0, r0, #0x1 @;; Clear M bit 0 to disable MMU
|
|
||||||
mcr p15, 0, r0, c1, c0, 0 @;; Write value back to CP15 System Control register
|
|
||||||
|
|
||||||
@;; SVC Mode(Default)
|
|
||||||
LDR sp, =__AStackTop
|
|
||||||
|
|
||||||
CPS #IRQ_MODE @;; IRQ Mode
|
@ Enable access to NEON/VFP by enabling access to Coprocessors 10 and 11.
|
||||||
LDR sp, =__BStackTop
|
@ Enables Full Access i.e. in both privileged and non privileged modes
|
||||||
|
mrc p15, 0, r0, c1, c0, 2 @ Read Coprocessor Access Control Register (CPACR)
|
||||||
|
orr r0, r0, #(0xF << 20) @ Enable access to CP 10 & 11
|
||||||
|
mcr p15, 0, r0, c1, c0, 2 @ Write Coprocessor Access Control Register (CPACR)
|
||||||
|
isb
|
||||||
|
|
||||||
CPS #FIQ_MODE @;; FIQ Mode
|
@ Switch on the VFP and NEON hardware
|
||||||
LDR sp, =__CStackTop
|
mov r0, #0x40000000
|
||||||
|
vmsr fpexc, r0 @ Write FPEXC register, EN bit set
|
||||||
|
|
||||||
@CPS #ABT_MODE @;; ABT Mode
|
mrc p15, 0, r0, c1, c0, 0 @ Read CP15 System Control register
|
||||||
@LDR sp, =__StackTop
|
bic r0, r0, #(0x1 << 12) @ Clear I bit 12 to disable I Cache
|
||||||
|
bic r0, r0, #(0x1 << 2) @ Clear C bit 2 to disable D Cache
|
||||||
|
bic r0, r0, #0x1 @ Clear M bit 0 to disable MMU
|
||||||
|
bic r0, r0, #(0x1 << 11) @ Clear Z bit 11 to disable branch prediction
|
||||||
|
bic r0, r0, #(0x1 << 13) @ Clear V bit 13 to disable hivecs
|
||||||
|
mcr p15, 0, r0, c1, c0, 0 @ Write value back to CP15 System Control register
|
||||||
|
isb
|
||||||
|
|
||||||
CPS #SYS_MODE @;; SYS Mode
|
@ Set Vector Base Address Register (VBAR) to point to this application's vector table
|
||||||
|
ldr r0, =__isr_vector
|
||||||
|
mcr p15, 0, r0, c12, c0, 0
|
||||||
|
|
||||||
|
@ Setup Stack for each exceptional mode
|
||||||
|
/* ldr r0, =__StackTop */
|
||||||
|
ldr r0, =__initial_sp
|
||||||
|
|
||||||
@; System mode Stack pointer is set up ARM_LIB_STACK in the __main()->__entry()
|
@ Enter Undefined Instruction Mode and set its Stack Pointer
|
||||||
LDR sp, =__StackTop
|
msr cpsr_c, #(Mode_UND | I_Bit | F_Bit)
|
||||||
|
mov sp, r0
|
||||||
|
sub r0, r0, #UND_Stack_Size
|
||||||
|
|
||||||
ldr r1, =__etext
|
@ Enter Abort Mode and set its Stack Pointer
|
||||||
ldr r2, =__data_start__
|
msr cpsr_c, #(Mode_ABT | I_Bit | F_Bit)
|
||||||
ldr r3, =__data_end__
|
mov sp, r0
|
||||||
|
sub r0, r0, #ABT_Stack_Size
|
||||||
|
|
||||||
.Lflash_to_ram_loop:
|
@ Enter FIQ Mode and set its Stack Pointer
|
||||||
cmp r2, r3
|
msr cpsr_c, #(Mode_FIQ | I_Bit | F_Bit)
|
||||||
ittt lt
|
mov sp, r0
|
||||||
ldrlt r0, [r1], #4
|
sub r0, r0, #FIQ_Stack_Size
|
||||||
strlt r0, [r2], #4
|
|
||||||
blt .Lflash_to_ram_loop
|
|
||||||
|
|
||||||
ldr r0, =set_low_vector
|
@ Enter IRQ Mode and set its Stack Pointer
|
||||||
blx r0
|
msr cpsr_c, #(Mode_IRQ | I_Bit | F_Bit)
|
||||||
ldr r0, =enable_VFP
|
mov sp, r0
|
||||||
blx r0
|
sub r0, r0, #IRQ_Stack_Size
|
||||||
|
|
||||||
ldr r0, =SystemInit
|
@ Enter Supervisor Mode and set its Stack Pointer
|
||||||
blx r0
|
msr cpsr_c, #(Mode_SVC | I_Bit | F_Bit)
|
||||||
ldr r0, =_start
|
mov sp, r0
|
||||||
bx r0
|
|
||||||
|
|
||||||
set_low_vector:
|
@ Enter System Mode to complete initialization and enter kernel
|
||||||
mrc p15, 0, r0, c1, c0, 0
|
msr cpsr_c, #(Mode_SYS | I_Bit | F_Bit)
|
||||||
mov r1, #0xffffdfff
|
mov sp, r0
|
||||||
and r0, r1
|
|
||||||
mcr p15, 0, r0, c1, c0, 0
|
|
||||||
|
|
||||||
mrc p15, 0, r0, c12, c0, 0 // vector set
|
isb
|
||||||
mov r0, #0x20000000
|
ldr r0, =RZ_A1_SetSramWriteEnable
|
||||||
mcr p15, 0, r0, c12, c0, 0 // vector set
|
blx r0
|
||||||
bx lr
|
|
||||||
|
.extern create_translation_table
|
||||||
|
bl create_translation_table
|
||||||
|
|
||||||
|
@ USR/SYS stack pointer will be set during kernel init
|
||||||
|
ldr r0, =SystemInit
|
||||||
|
blx r0
|
||||||
|
ldr r0, =InitMemorySubsystem
|
||||||
|
blx r0
|
||||||
|
|
||||||
|
@ fp_init
|
||||||
|
mov r0, #0x3000000
|
||||||
|
vmsr fpscr, r0
|
||||||
|
|
||||||
|
|
||||||
|
@ data sections copy
|
||||||
|
ldr r4, =__copy_table_start__
|
||||||
|
ldr r5, =__copy_table_end__
|
||||||
|
|
||||||
|
.L_loop0:
|
||||||
|
cmp r4, r5
|
||||||
|
bge .L_loop0_done
|
||||||
|
ldr r1, [r4]
|
||||||
|
ldr r2, [r4, #4]
|
||||||
|
ldr r3, [r4, #8]
|
||||||
|
|
||||||
|
.L_loop0_0:
|
||||||
|
subs r3, #4
|
||||||
|
ittt ge
|
||||||
|
ldrge r0, [r1, r3]
|
||||||
|
strge r0, [r2, r3]
|
||||||
|
bge .L_loop0_0
|
||||||
|
|
||||||
|
adds r4, #12
|
||||||
|
b .L_loop0
|
||||||
|
|
||||||
|
.L_loop0_done:
|
||||||
|
|
||||||
|
@ bss sections clear
|
||||||
|
ldr r3, =__zero_table_start__
|
||||||
|
ldr r4, =__zero_table_end__
|
||||||
|
|
||||||
|
.L_loop2:
|
||||||
|
cmp r3, r4
|
||||||
|
bge .L_loop2_done
|
||||||
|
ldr r1, [r3]
|
||||||
|
ldr r2, [r3, #4]
|
||||||
|
movs r0, 0
|
||||||
|
|
||||||
|
.L_loop2_0:
|
||||||
|
subs r2, #4
|
||||||
|
itt ge
|
||||||
|
strge r0, [r1, r2]
|
||||||
|
bge .L_loop2_0
|
||||||
|
|
||||||
|
adds r3, #8
|
||||||
|
b .L_loop2
|
||||||
|
.L_loop2_done:
|
||||||
|
|
||||||
|
|
||||||
|
ldr r0, =_start
|
||||||
|
bx r0
|
||||||
|
|
||||||
|
ldr r0, sf_boot @ dummy to keep boot loader area
|
||||||
|
loop_here:
|
||||||
|
b loop_here
|
||||||
|
|
||||||
|
sf_boot:
|
||||||
|
.word boot_loader
|
||||||
|
|
||||||
.equ VFPEnable, 0x40000000
|
|
||||||
enable_VFP:
|
|
||||||
;;
|
|
||||||
mrc p15, 0, r0, c1, c0, 2 ;
|
|
||||||
orr r0, r0, #(3 << 20) ;
|
|
||||||
orr r0, r0, #(3 << 22) ;
|
|
||||||
bic r0, r0, #(3 << 30) ;
|
|
||||||
mcr p15, 0, r0, c1, c0, 2 ;
|
|
||||||
isb ;
|
|
||||||
;;
|
|
||||||
mov r0, #VFPEnable
|
|
||||||
vmsr fpexc, r0
|
|
||||||
bx lr
|
|
||||||
;;
|
|
||||||
.pool
|
.pool
|
||||||
.size Reset_Handler, . - Reset_Handler
|
.size Reset_Handler, . - Reset_Handler
|
||||||
|
|
||||||
|
|
||||||
.text
|
.text
|
||||||
|
|
||||||
|
Undef_Handler:
|
||||||
|
.global Undef_Handler
|
||||||
|
.func Undef_Handler
|
||||||
|
.extern CUndefHandler
|
||||||
|
SRSDB SP!, #Mode_UND
|
||||||
|
PUSH {R0-R4, R12} /* Save APCS corruptible registers to UND mode stack */
|
||||||
|
|
||||||
|
MRS R0, SPSR
|
||||||
|
TST R0, #T_Bit /* Check mode */
|
||||||
|
MOVEQ R1, #4 /* R1 = 4 ARM mode */
|
||||||
|
MOVNE R1, #2 /* R1 = 2 Thumb mode */
|
||||||
|
SUB R0, LR, R1
|
||||||
|
LDREQ R0, [R0] /* ARM mode - R0 points to offending instruction */
|
||||||
|
BEQ undef_cont
|
||||||
|
|
||||||
|
/* Thumb instruction */
|
||||||
|
/* Determine if it is a 32-bit Thumb instruction */
|
||||||
|
LDRH R0, [R0]
|
||||||
|
MOV R2, #0x1c
|
||||||
|
CMP R2, R0, LSR #11
|
||||||
|
BHS undef_cont /* 16-bit Thumb instruction */
|
||||||
|
|
||||||
|
/* 32-bit Thumb instruction. Unaligned - we need to reconstruct the offending instruction. */
|
||||||
|
LDRH R2, [LR]
|
||||||
|
ORR R0, R2, R0, LSL #16
|
||||||
|
undef_cont:
|
||||||
|
MOV R2, LR /* Set LR to third argument */
|
||||||
|
|
||||||
|
/* AND R12, SP, #4 */ /* Ensure stack is 8-byte aligned */
|
||||||
|
MOV R3, SP /* Ensure stack is 8-byte aligned */
|
||||||
|
AND R12, R3, #4
|
||||||
|
SUB SP, SP, R12 /* Adjust stack */
|
||||||
|
PUSH {R12, LR} /* Store stack adjustment and dummy LR */
|
||||||
|
|
||||||
|
/* R0 Offending instruction */
|
||||||
|
/* R1 =2 (Thumb) or =4 (ARM) */
|
||||||
|
BL CUndefHandler
|
||||||
|
|
||||||
|
POP {R12, LR} /* Get stack adjustment & discard dummy LR */
|
||||||
|
ADD SP, SP, R12 /* Unadjust stack */
|
||||||
|
|
||||||
|
LDR LR, [SP, #24] /* Restore stacked LR and possibly adjust for retry */
|
||||||
|
SUB LR, LR, R0
|
||||||
|
LDR R0, [SP, #28] /* Restore stacked SPSR */
|
||||||
|
MSR SPSR_cxsf, R0
|
||||||
|
POP {R0-R4, R12} /* Restore stacked APCS registers */
|
||||||
|
ADD SP, SP, #8 /* Adjust SP for already-restored banked registers */
|
||||||
|
MOVS PC, LR
|
||||||
|
.endfunc
|
||||||
|
|
||||||
|
PAbt_Handler:
|
||||||
|
.global PAbt_Handler
|
||||||
|
.func PAbt_Handler
|
||||||
|
.extern CPAbtHandler
|
||||||
|
SUB LR, LR, #4 /* Pre-adjust LR */
|
||||||
|
SRSDB SP!, #Mode_ABT /* Save LR and SPRS to ABT mode stack */
|
||||||
|
PUSH {R0-R4, R12} /* Save APCS corruptible registers to ABT mode stack */
|
||||||
|
MRC p15, 0, R0, c5, c0, 1 /* IFSR */
|
||||||
|
MRC p15, 0, R1, c6, c0, 2 /* IFAR */
|
||||||
|
|
||||||
|
MOV R2, LR /* Set LR to third argument */
|
||||||
|
|
||||||
|
/* AND R12, SP, #4 */ /* Ensure stack is 8-byte aligned */
|
||||||
|
MOV R3, SP /* Ensure stack is 8-byte aligned */
|
||||||
|
AND R12, R3, #4
|
||||||
|
SUB SP, SP, R12 /* Adjust stack */
|
||||||
|
PUSH {R12, LR} /* Store stack adjustment and dummy LR */
|
||||||
|
|
||||||
|
BL CPAbtHandler
|
||||||
|
|
||||||
|
POP {R12, LR} /* Get stack adjustment & discard dummy LR */
|
||||||
|
ADD SP, SP, R12 /* Unadjust stack */
|
||||||
|
|
||||||
|
POP {R0-R4, R12} /* Restore stack APCS registers */
|
||||||
|
RFEFD SP! /* Return from exception */
|
||||||
|
.endfunc
|
||||||
|
|
||||||
|
DAbt_Handler:
|
||||||
|
.global DAbt_Handler
|
||||||
|
.func DAbt_Handler
|
||||||
|
.extern CDAbtHandler
|
||||||
|
SUB LR, LR, #8 /* Pre-adjust LR */
|
||||||
|
SRSDB SP!, #Mode_ABT /* Save LR and SPRS to ABT mode stack */
|
||||||
|
PUSH {R0-R4, R12} /* Save APCS corruptible registers to ABT mode stack */
|
||||||
|
CLREX /* State of exclusive monitors unknown after taken data abort */
|
||||||
|
MRC p15, 0, R0, c5, c0, 0 /* DFSR */
|
||||||
|
MRC p15, 0, R1, c6, c0, 0 /* DFAR */
|
||||||
|
|
||||||
|
MOV R2, LR /* Set LR to third argument */
|
||||||
|
|
||||||
|
/* AND R12, SP, #4 */ /* Ensure stack is 8-byte aligned */
|
||||||
|
MOV R3, SP /* Ensure stack is 8-byte aligned */
|
||||||
|
AND R12, R3, #4
|
||||||
|
SUB SP, SP, R12 /* Adjust stack */
|
||||||
|
PUSH {R12, LR} /* Store stack adjustment and dummy LR */
|
||||||
|
|
||||||
|
BL CDAbtHandler
|
||||||
|
|
||||||
|
POP {R12, LR} /* Get stack adjustment & discard dummy LR */
|
||||||
|
ADD SP, SP, R12 /* Unadjust stack */
|
||||||
|
|
||||||
|
POP {R0-R4, R12} /* Restore stacked APCS registers */
|
||||||
|
RFEFD SP! /* Return from exception */
|
||||||
|
.endfunc
|
||||||
|
|
||||||
|
FIQ_Handler:
|
||||||
|
.global FIQ_Handler
|
||||||
|
.func FIQ_Handler
|
||||||
|
/* An FIQ might occur between the dummy read and the real read of the GIC in IRQ_Handler,
|
||||||
|
* so if a real FIQ Handler is implemented, this will be needed before returning:
|
||||||
|
*/
|
||||||
|
/* LDR R1, =GICI_BASE
|
||||||
|
LDR R0, [R1, #ICCHPIR_OFFSET] ; Dummy Read ICCHPIR (GIC CPU Interface register) to avoid GIC 390 errata 801120
|
||||||
|
*/
|
||||||
|
B .
|
||||||
|
.endfunc
|
||||||
|
|
||||||
|
.extern SVC_Handler /* refer RTX function */
|
||||||
|
|
||||||
|
IRQ_Handler:
|
||||||
|
.global IRQ_Handler
|
||||||
|
.func IRQ_Handler
|
||||||
|
.extern IRQCount
|
||||||
|
.extern IRQTable
|
||||||
|
.extern IRQNestLevel
|
||||||
|
|
||||||
|
/* prologue */
|
||||||
|
SUB LR, LR, #4 /* Pre-adjust LR */
|
||||||
|
SRSDB SP!, #Mode_SVC /* Save LR_IRQ and SPRS_IRQ to SVC mode stack */
|
||||||
|
CPS #Mode_SVC /* Switch to SVC mode, to avoid a nested interrupt corrupting LR on a BL */
|
||||||
|
PUSH {R0-R3, R12} /* Save remaining APCS corruptible registers to SVC stack */
|
||||||
|
|
||||||
|
/* AND R1, SP, #4 */ /* Ensure stack is 8-byte aligned */
|
||||||
|
MOV R3, SP /* Ensure stack is 8-byte aligned */
|
||||||
|
AND R1, R3, #4
|
||||||
|
SUB SP, SP, R1 /* Adjust stack */
|
||||||
|
PUSH {R1, LR} /* Store stack adjustment and LR_SVC to SVC stack */
|
||||||
|
|
||||||
|
LDR R0, =IRQNestLevel /* Get address of nesting counter */
|
||||||
|
LDR R1, [R0]
|
||||||
|
ADD R1, R1, #1 /* Increment nesting counter */
|
||||||
|
STR R1, [R0]
|
||||||
|
|
||||||
|
/* identify and acknowledge interrupt */
|
||||||
|
LDR R1, =GICI_BASE
|
||||||
|
LDR R0, [R1, #ICCHPIR_OFFSET] /* Dummy Read ICCHPIR (GIC CPU Interface register) to avoid GIC 390 errata 801120 */
|
||||||
|
LDR R0, [R1, #ICCIAR_OFFSET] /* Read ICCIAR (GIC CPU Interface register) */
|
||||||
|
DSB /* Ensure that interrupt acknowledge completes before re-enabling interrupts */
|
||||||
|
|
||||||
|
/* Workaround GIC 390 errata 733075
|
||||||
|
* If the ID is not 0, then service the interrupt as normal.
|
||||||
|
* If the ID is 0 and active, then service interrupt ID 0 as normal.
|
||||||
|
* If the ID is 0 but not active, then the GIC CPU interface may be locked-up, so unlock it
|
||||||
|
* with a dummy write to ICDIPR0. This interrupt should be treated as spurious and not serviced.
|
||||||
|
*/
|
||||||
|
LDR R2, =GICD_BASE
|
||||||
|
LDR R3, =GIC_ERRATA_CHECK_1
|
||||||
|
CMP R0, R3
|
||||||
|
BEQ unlock_cpu
|
||||||
|
LDR R3, =GIC_ERRATA_CHECK_2
|
||||||
|
CMP R0, R3
|
||||||
|
BEQ unlock_cpu
|
||||||
|
CMP R0, #0
|
||||||
|
BNE int_active /* If the ID is not 0, then service the interrupt */
|
||||||
|
LDR R3, [R2, #ICDABR0_OFFSET] /* Get the interrupt state */
|
||||||
|
TST R3, #1
|
||||||
|
BNE int_active /* If active, then service the interrupt */
|
||||||
|
unlock_cpu:
|
||||||
|
LDR R3, [R2, #ICDIPR0_OFFSET] /* Not active, so unlock the CPU interface */
|
||||||
|
STR R3, [R2, #ICDIPR0_OFFSET] /* with a dummy write */
|
||||||
|
DSB /* Ensure the write completes before continuing */
|
||||||
|
B ret_irq /* Do not service the spurious interrupt */
|
||||||
|
/* End workaround */
|
||||||
|
|
||||||
|
int_active:
|
||||||
|
LDR R2, =IRQCount /* Read number of IRQs */
|
||||||
|
LDR R2, [R2]
|
||||||
|
CMP R0, R2 /* Clean up and return if no handler */
|
||||||
|
BHS ret_irq /* In a single-processor system, spurious interrupt ID 1023 does not need any special handling */
|
||||||
|
LDR R2, =IRQTable /* Get address of handler */
|
||||||
|
LDR R2, [R2, R0, LSL #2]
|
||||||
|
CMP R2, #0 /* Clean up and return if handler address is 0 */
|
||||||
|
BEQ ret_irq
|
||||||
|
PUSH {R0,R1}
|
||||||
|
|
||||||
|
CPSIE i /* Now safe to re-enable interrupts */
|
||||||
|
BLX R2 /* Call handler. R0 will be IRQ number */
|
||||||
|
CPSID i /* Disable interrupts again */
|
||||||
|
|
||||||
|
/* write EOIR (GIC CPU Interface register) */
|
||||||
|
POP {R0,R1}
|
||||||
|
DSB /* Ensure that interrupt source is cleared before we write the EOIR */
|
||||||
|
ret_irq:
|
||||||
|
/* epilogue */
|
||||||
|
STR R0, [R1, #ICCEOIR_OFFSET]
|
||||||
|
|
||||||
|
LDR R0, =IRQNestLevel /* Get address of nesting counter */
|
||||||
|
LDR R1, [R0]
|
||||||
|
SUB R1, R1, #1 /* Decrement nesting counter */
|
||||||
|
STR R1, [R0]
|
||||||
|
|
||||||
|
POP {R1, LR} /* Get stack adjustment and restore LR_SVC */
|
||||||
|
ADD SP, SP, R1 /* Unadjust stack */
|
||||||
|
|
||||||
|
POP {R0-R3,R12} /* Restore stacked APCS registers */
|
||||||
|
RFEFD SP! /* Return from exception */
|
||||||
|
.endfunc
|
||||||
|
|
||||||
/* Macro to define default handlers. Default handler
|
/* Macro to define default handlers. Default handler
|
||||||
* will be weak symbol and just dead loops. They can be
|
* will be weak symbol and just dead loops. They can be
|
||||||
* overwritten by other handlers */
|
* overwritten by other handlers */
|
||||||
.macro def_default_handler handler_name
|
.macro def_default_handler handler_name
|
||||||
.align 1
|
.align 1
|
||||||
.thumb_func
|
.thumb_func
|
||||||
.weak \handler_name
|
.weak \handler_name
|
||||||
.type \handler_name, %function
|
.type \handler_name, %function
|
||||||
\handler_name :
|
\handler_name :
|
||||||
b .
|
b .
|
||||||
.size \handler_name, . - \handler_name
|
.size \handler_name, . - \handler_name
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
def_default_handler undefinedInstruction /* 0x24 */
|
def_default_handler SVC_Handler
|
||||||
def_default_handler softwareInterrupt /* 0x28 */
|
|
||||||
def_default_handler prefetchAboart /* 0x2c */
|
|
||||||
def_default_handler dataAbort /* 0x30 */
|
|
||||||
def_default_handler Default_Handler /* --- */
|
|
||||||
|
|
||||||
.global __disable_irq
|
|
||||||
.global __enable_irq
|
|
||||||
|
|
||||||
.global __disable_fiq
|
|
||||||
.global __enable_fiq
|
|
||||||
|
|
||||||
__disable_irq:
|
|
||||||
mrs r0,apsr @ formerly cpsr
|
|
||||||
and r0,r0,#0x80
|
|
||||||
cpsid i
|
|
||||||
bx lr
|
|
||||||
|
|
||||||
__enable_irq:
|
|
||||||
cpsie i
|
|
||||||
bx lr
|
|
||||||
|
|
||||||
|
|
||||||
__disable_fiq:
|
/* User Initial Stack & Heap */
|
||||||
cpsid f
|
|
||||||
bx lr
|
|
||||||
|
|
||||||
__enable_fiq:
|
.ifdef __MICROLIB
|
||||||
cpsie f
|
|
||||||
bx lr
|
.global __initial_sp
|
||||||
|
.global __heap_base
|
||||||
|
.global __heap_limit
|
||||||
|
|
||||||
|
.else
|
||||||
|
|
||||||
|
.extern __use_two_region_memory
|
||||||
|
.global __user_initial_stackheap
|
||||||
|
__user_initial_stackheap:
|
||||||
|
|
||||||
|
LDR R0, = __HeapBase
|
||||||
|
LDR R1, =(__StackLimit + USR_Stack_Size)
|
||||||
|
LDR R2, = (__HeapBase + Heap_Size)
|
||||||
|
LDR R3, = __StackLimit
|
||||||
|
BX LR
|
||||||
|
|
||||||
|
.endif
|
||||||
|
|
||||||
|
|
||||||
|
.END
|
||||||
.end
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,8 +26,14 @@
|
||||||
* $Date:: $
|
* $Date:: $
|
||||||
* @brief RZ_A1 serial flash boot loader
|
* @brief RZ_A1 serial flash boot loader
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
#if defined (__CC_ARM)
|
||||||
#pragma arm section rodata = "BOOT_LOADER"
|
#pragma arm section rodata = "BOOT_LOADER"
|
||||||
const char boot_loader[] __attribute__((used)) =
|
const char boot_loader[] __attribute__((used)) =
|
||||||
|
|
||||||
|
#else
|
||||||
|
const char boot_loader[] __attribute__ ((section(".boot_loader"), used)) =
|
||||||
|
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
0x18,0xF0,0x9F,0xE5,0x18,0xF0,0x9F,0xE5,0x18,0xF0,0x9F,0xE5,0x18,0xF0,0x9F,0xE5,
|
0x18,0xF0,0x9F,0xE5,0x18,0xF0,0x9F,0xE5,0x18,0xF0,0x9F,0xE5,0x18,0xF0,0x9F,0xE5,
|
||||||
0x18,0xF0,0x9F,0xE5,0x18,0xF0,0x9F,0xE5,0x18,0xF0,0x9F,0xE5,0x18,0xF0,0x9F,0xE5,
|
0x18,0xF0,0x9F,0xE5,0x18,0xF0,0x9F,0xE5,0x18,0xF0,0x9F,0xE5,0x18,0xF0,0x9F,0xE5,
|
||||||
|
|
@ -814,6 +820,7 @@ const char boot_loader[] __attribute__((used)) =
|
||||||
0x00,0x02,0x00,0x18,0x00,0x00,0x02,0x20,0x04,0x00,0x9F,0xE5,0x10,0x0F,0x0C,0xEE,
|
0x00,0x02,0x00,0x18,0x00,0x00,0x02,0x20,0x04,0x00,0x9F,0xE5,0x10,0x0F,0x0C,0xEE,
|
||||||
0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x00,0x18,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x00,0x18,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||||
};
|
};
|
||||||
|
#if defined (__CC_ARM)
|
||||||
#pragma arm section
|
#pragma arm section
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -72,16 +72,31 @@ extern uint32_t Image$$RO_DATA$$Base;
|
||||||
extern uint32_t Image$$RW_DATA$$Base;
|
extern uint32_t Image$$RW_DATA$$Base;
|
||||||
extern uint32_t Image$$ZI_DATA$$Base;
|
extern uint32_t Image$$ZI_DATA$$Base;
|
||||||
extern uint32_t Image$$TTB$$ZI$$Base;
|
extern uint32_t Image$$TTB$$ZI$$Base;
|
||||||
|
#if defined( __CC_ARM )
|
||||||
|
#else
|
||||||
|
extern uint32_t Image$$RW_DATA_NC$$Base;
|
||||||
|
extern uint32_t Image$$ZI_DATA_NC$$Base;
|
||||||
|
#endif
|
||||||
|
|
||||||
extern uint32_t Image$$VECTORS$$Limit;
|
extern uint32_t Image$$VECTORS$$Limit;
|
||||||
extern uint32_t Image$$RO_DATA$$Limit;
|
extern uint32_t Image$$RO_DATA$$Limit;
|
||||||
extern uint32_t Image$$RW_DATA$$Limit;
|
extern uint32_t Image$$RW_DATA$$Limit;
|
||||||
extern uint32_t Image$$ZI_DATA$$Limit;
|
extern uint32_t Image$$ZI_DATA$$Limit;
|
||||||
|
#if defined( __CC_ARM )
|
||||||
|
#else
|
||||||
|
extern uint32_t Image$$RW_DATA_NC$$Limit;
|
||||||
|
extern uint32_t Image$$ZI_DATA_NC$$Limit;
|
||||||
|
#endif
|
||||||
|
|
||||||
#define VECTORS_SIZE (((uint32_t)&Image$$VECTORS$$Limit >> 20) - ((uint32_t)&Image$$VECTORS$$Base >> 20) + 1)
|
#define VECTORS_SIZE (((uint32_t)&Image$$VECTORS$$Limit >> 20) - ((uint32_t)&Image$$VECTORS$$Base >> 20) + 1)
|
||||||
#define RO_DATA_SIZE (((uint32_t)&Image$$RO_DATA$$Limit >> 20) - ((uint32_t)&Image$$RO_DATA$$Base >> 20) + 1)
|
#define RO_DATA_SIZE (((uint32_t)&Image$$RO_DATA$$Limit >> 20) - ((uint32_t)&Image$$RO_DATA$$Base >> 20) + 1)
|
||||||
#define RW_DATA_SIZE (((uint32_t)&Image$$RW_DATA$$Limit >> 20) - ((uint32_t)&Image$$RW_DATA$$Base >> 20) + 1)
|
#define RW_DATA_SIZE (((uint32_t)&Image$$RW_DATA$$Limit >> 20) - ((uint32_t)&Image$$RW_DATA$$Base >> 20) + 1)
|
||||||
#define ZI_DATA_SIZE (((uint32_t)&Image$$ZI_DATA$$Limit >> 20) - ((uint32_t)&Image$$ZI_DATA$$Base >> 20) + 1)
|
#define ZI_DATA_SIZE (((uint32_t)&Image$$ZI_DATA$$Limit >> 20) - ((uint32_t)&Image$$ZI_DATA$$Base >> 20) + 1)
|
||||||
|
#if defined( __CC_ARM )
|
||||||
|
#else
|
||||||
|
#define RW_DATA_NC_SIZE (((uint32_t)&Image$$RW_DATA_NC$$Limit >> 20) - ((uint32_t)&Image$$RW_DATA_NC$$Base >> 20) + 1)
|
||||||
|
#define ZI_DATA_NC_SIZE (((uint32_t)&Image$$ZI_DATA_NC$$Limit >> 20) - ((uint32_t)&Image$$ZI_DATA_NC$$Base >> 20) + 1)
|
||||||
|
#endif
|
||||||
|
|
||||||
static uint32_t Sect_Normal; //outer & inner wb/wa, non-shareable, executable, rw, domain 0, base addr 0
|
static uint32_t Sect_Normal; //outer & inner wb/wa, non-shareable, executable, rw, domain 0, base addr 0
|
||||||
static uint32_t Sect_Normal_NC; //non-shareable, non-executable, rw, domain 0, base addr 0
|
static uint32_t Sect_Normal_NC; //non-shareable, non-executable, rw, domain 0, base addr 0
|
||||||
|
|
@ -147,7 +162,12 @@ void create_translation_table(void)
|
||||||
__TTSection (&Image$$TTB$$ZI$$Base, (uint32_t)&Image$$VECTORS$$Base, VECTORS_SIZE, Sect_Normal_Cod);
|
__TTSection (&Image$$TTB$$ZI$$Base, (uint32_t)&Image$$VECTORS$$Base, VECTORS_SIZE, Sect_Normal_Cod);
|
||||||
__TTSection (&Image$$TTB$$ZI$$Base, (uint32_t)&Image$$RW_DATA$$Base, RW_DATA_SIZE, Sect_Normal_RW);
|
__TTSection (&Image$$TTB$$ZI$$Base, (uint32_t)&Image$$RW_DATA$$Base, RW_DATA_SIZE, Sect_Normal_RW);
|
||||||
__TTSection (&Image$$TTB$$ZI$$Base, (uint32_t)&Image$$ZI_DATA$$Base, ZI_DATA_SIZE, Sect_Normal_RW);
|
__TTSection (&Image$$TTB$$ZI$$Base, (uint32_t)&Image$$ZI_DATA$$Base, ZI_DATA_SIZE, Sect_Normal_RW);
|
||||||
|
#if defined( __CC_ARM )
|
||||||
__TTSection (&Image$$TTB$$ZI$$Base, Renesas_RZ_A1_ONCHIP_SRAM_NC_BASE, 10, Sect_Normal_NC);
|
__TTSection (&Image$$TTB$$ZI$$Base, Renesas_RZ_A1_ONCHIP_SRAM_NC_BASE, 10, Sect_Normal_NC);
|
||||||
|
#else
|
||||||
|
__TTSection (&Image$$TTB$$ZI$$Base, (uint32_t)&Image$$RW_DATA_NC$$Base, RW_DATA_NC_SIZE, Sect_Normal_NC);
|
||||||
|
__TTSection (&Image$$TTB$$ZI$$Base, (uint32_t)&Image$$ZI_DATA_NC$$Base, ZI_DATA_NC_SIZE, Sect_Normal_NC);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Set location of level 1 page table
|
/* Set location of level 1 page table
|
||||||
; 31:14 - Translation table base addr (31:14-TTBCR.N, TTBCR.N is 0 out of reset)
|
; 31:14 - Translation table base addr (31:14-TTBCR.N, TTBCR.N is 0 out of reset)
|
||||||
|
|
|
||||||
|
|
@ -41,12 +41,18 @@
|
||||||
#include "RZ_A1_Init.h"
|
#include "RZ_A1_Init.h"
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__ARMCC_VERSION)
|
||||||
extern void $Super$$main(void);
|
extern void $Super$$main(void);
|
||||||
__asm void FPUEnable(void);
|
__asm void FPUEnable(void);
|
||||||
|
#else
|
||||||
|
void FPUEnable(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
uint32_t IRQNestLevel;
|
uint32_t IRQNestLevel;
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__ARMCC_VERSION)
|
||||||
/**
|
/**
|
||||||
* Initialize the cache.
|
* Initialize the cache.
|
||||||
*
|
*
|
||||||
|
|
@ -92,6 +98,45 @@ void InitMemorySubsystem(void) {
|
||||||
}
|
}
|
||||||
#pragma pop
|
#pragma pop
|
||||||
|
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
|
||||||
|
void InitMemorySubsystem(void) {
|
||||||
|
|
||||||
|
/* This SVC is specific for reset where data / tlb / btac may contain undefined data, therefore before
|
||||||
|
* enabling the cache you must invalidate the instruction cache, the data cache, TLB, and BTAC.
|
||||||
|
* You are not required to invalidate the main TLB, even though it is recommended for safety
|
||||||
|
* reasons. This ensures compatibility with future revisions of the processor. */
|
||||||
|
|
||||||
|
unsigned int l2_id;
|
||||||
|
|
||||||
|
/* Invalidate undefined data */
|
||||||
|
__ca9u_inv_tlb_all();
|
||||||
|
__v7_inv_icache_all();
|
||||||
|
__v7_inv_dcache_all();
|
||||||
|
__v7_inv_btac();
|
||||||
|
|
||||||
|
/* Don't use this function during runtime since caches may contain valid data. For a correct cache maintenance you may need to execute a clean and
|
||||||
|
* invalidate in order to flush the valid data to the next level cache.
|
||||||
|
*/
|
||||||
|
__enable_mmu();
|
||||||
|
|
||||||
|
/* After MMU is enabled and data has been invalidated, enable caches and BTAC */
|
||||||
|
__enable_caches();
|
||||||
|
__enable_btac();
|
||||||
|
|
||||||
|
/* If present, you may also need to Invalidate and Enable L2 cache here */
|
||||||
|
l2_id = PL310_GetID();
|
||||||
|
if (l2_id)
|
||||||
|
{
|
||||||
|
PL310_InvAllByWay();
|
||||||
|
PL310_Enable();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
IRQHandler IRQTable[Renesas_RZ_A1_IRQ_MAX+1];
|
IRQHandler IRQTable[Renesas_RZ_A1_IRQ_MAX+1];
|
||||||
|
|
||||||
uint32_t IRQCount = sizeof IRQTable / 4;
|
uint32_t IRQCount = sizeof IRQTable / 4;
|
||||||
|
|
@ -237,8 +282,8 @@ void CPAbtHandler(uint32_t IFSR, uint32_t IFAR, uint32_t LR) {
|
||||||
//this will be 2 when we have performed some maintenance and want to retry the instruction in thumb (state == 2)
|
//this will be 2 when we have performed some maintenance and want to retry the instruction in thumb (state == 2)
|
||||||
//this will be 4 when we have performed some maintenance and want to retry the instruction in arm (state == 4)
|
//this will be 4 when we have performed some maintenance and want to retry the instruction in arm (state == 4)
|
||||||
uint32_t CUndefHandler(uint32_t opcode, uint32_t state, uint32_t LR) {
|
uint32_t CUndefHandler(uint32_t opcode, uint32_t state, uint32_t LR) {
|
||||||
const int THUMB = 2;
|
const unsigned int THUMB = 2;
|
||||||
const int ARM = 4;
|
const unsigned int ARM = 4;
|
||||||
//Lazy VFP/NEON initialisation and switching
|
//Lazy VFP/NEON initialisation and switching
|
||||||
if ((state == ARM && ((opcode & 0x0C000000)) >> 26 == 0x03) ||
|
if ((state == ARM && ((opcode & 0x0C000000)) >> 26 == 0x03) ||
|
||||||
(state == THUMB && ((opcode & 0xEC000000)) >> 26 == 0x3B)) {
|
(state == THUMB && ((opcode & 0xEC000000)) >> 26 == 0x3B)) {
|
||||||
|
|
@ -252,6 +297,7 @@ uint32_t CUndefHandler(uint32_t opcode, uint32_t state, uint32_t LR) {
|
||||||
while(1);
|
while(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(__ARMCC_VERSION)
|
||||||
#pragma push
|
#pragma push
|
||||||
#pragma arm
|
#pragma arm
|
||||||
//Critical section, called from undef handler, so systick is disabled
|
//Critical section, called from undef handler, so systick is disabled
|
||||||
|
|
@ -296,3 +342,43 @@ __asm void FPUEnable(void) {
|
||||||
BX LR
|
BX LR
|
||||||
}
|
}
|
||||||
#pragma pop
|
#pragma pop
|
||||||
|
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
void FPUEnable(void)
|
||||||
|
{
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
".align 2 \n\t"
|
||||||
|
".arm \n\t"
|
||||||
|
"mrc p15,0,r1,c1,c0,2 \n\t"
|
||||||
|
"orr r1,r1,#0x00f00000 \n\t"
|
||||||
|
"mcr p15,0,r1,c1,c0,2 \n\t"
|
||||||
|
"vmrs r1,fpexc \n\t"
|
||||||
|
"orr r1,r1,#0x40000000 \n\t"
|
||||||
|
"vmsr fpexc,r1 \n\t"
|
||||||
|
"mov r2,#0 \n\t"
|
||||||
|
"vmov d0, r2,r2 \n\t"
|
||||||
|
"vmov d1, r2,r2 \n\t"
|
||||||
|
"vmov d2, r2,r2 \n\t"
|
||||||
|
"vmov d3, r2,r2 \n\t"
|
||||||
|
"vmov d4, r2,r2 \n\t"
|
||||||
|
"vmov d5, r2,r2 \n\t"
|
||||||
|
"vmov d6, r2,r2 \n\t"
|
||||||
|
"vmov d7, r2,r2 \n\t"
|
||||||
|
"vmov d8, r2,r2 \n\t"
|
||||||
|
"vmov d9, r2,r2 \n\t"
|
||||||
|
"vmov d10,r2,r2 \n\t"
|
||||||
|
"vmov d11,r2,r2 \n\t"
|
||||||
|
"vmov d12,r2,r2 \n\t"
|
||||||
|
"vmov d13,r2,r2 \n\t"
|
||||||
|
"vmov d14,r2,r2 \n\t"
|
||||||
|
"vmov d15,r2,r2 \n\t"
|
||||||
|
"vmrs r2,fpscr \n\t"
|
||||||
|
"ldr r3,=0x00086060 \n\t"
|
||||||
|
"and r2,r2,r3 \n\t"
|
||||||
|
"vmsr fpscr,r2 \n\t"
|
||||||
|
"bx lr \n\t"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,9 @@ define symbol __ICFEDIT_region_NVIC_end__ = 0x200000EB;
|
||||||
define symbol __ICFEDIT_region_RAM_start__ = 0x200000EC;
|
define symbol __ICFEDIT_region_RAM_start__ = 0x200000EC;
|
||||||
define symbol __ICFEDIT_region_RAM_end__ = 0x20004FFF;
|
define symbol __ICFEDIT_region_RAM_end__ = 0x20004FFF;
|
||||||
/*-Sizes-*/
|
/*-Sizes-*/
|
||||||
define symbol __ICFEDIT_size_cstack__ = 0x1000;
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __ICFEDIT_size_heap__ = 0x1700;
|
define symbol __ICFEDIT_size_cstack__ = 0xA00;
|
||||||
|
define symbol __ICFEDIT_size_heap__ = 0x1400;
|
||||||
/**** End of ICF editor section. ###ICF###*/
|
/**** End of ICF editor section. ###ICF###*/
|
||||||
|
|
||||||
define memory mem with size = 4G;
|
define memory mem with size = 4G;
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,8 @@ define region ROM_region = mem:[from __region_ROM_start__ to __region_ROM_end__]
|
||||||
define region RAM_region = mem:[from __region_RAM_start__ to __region_RAM_end__];
|
define region RAM_region = mem:[from __region_RAM_start__ to __region_RAM_end__];
|
||||||
|
|
||||||
/* Stack and Heap */
|
/* Stack and Heap */
|
||||||
define symbol __size_cstack__ = 0x800;
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
|
define symbol __size_cstack__ = 0x400;
|
||||||
define symbol __size_heap__ = 0x800;
|
define symbol __size_heap__ = 0x800;
|
||||||
define block CSTACK with alignment = 8, size = __size_cstack__ { };
|
define block CSTACK with alignment = 8, size = __size_cstack__ { };
|
||||||
define block HEAP with alignment = 8, size = __size_heap__ { };
|
define block HEAP with alignment = 8, size = __size_heap__ { };
|
||||||
|
|
|
||||||
|
|
@ -15,8 +15,9 @@ define region ROM_region = mem:[from __region_ROM_start__ to __region_ROM_end__]
|
||||||
define region RAM_region = mem:[from __region_RAM_start__ to __region_RAM_end__];
|
define region RAM_region = mem:[from __region_RAM_start__ to __region_RAM_end__];
|
||||||
|
|
||||||
/* Stack and Heap */
|
/* Stack and Heap */
|
||||||
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __size_cstack__ = 0x800;
|
define symbol __size_cstack__ = 0x800;
|
||||||
define symbol __size_heap__ = 0x800;
|
define symbol __size_heap__ = 0x1000;
|
||||||
define block CSTACK with alignment = 8, size = __size_cstack__ { };
|
define block CSTACK with alignment = 8, size = __size_cstack__ { };
|
||||||
define block HEAP with alignment = 8, size = __size_heap__ { };
|
define block HEAP with alignment = 8, size = __size_heap__ { };
|
||||||
define block STACKHEAP with fixed order { block HEAP, block CSTACK };
|
define block STACKHEAP with fixed order { block HEAP, block CSTACK };
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ define region RAM_region = mem:[from __region_RAM_start__ to __region_RAM_end__]
|
||||||
|
|
||||||
/* Stack and Heap */
|
/* Stack and Heap */
|
||||||
define symbol __size_cstack__ = 0x800;
|
define symbol __size_cstack__ = 0x800;
|
||||||
define symbol __size_heap__ = 0x800;
|
define symbol __size_heap__ = 0x1000;
|
||||||
define block CSTACK with alignment = 8, size = __size_cstack__ { };
|
define block CSTACK with alignment = 8, size = __size_cstack__ { };
|
||||||
define block HEAP with alignment = 8, size = __size_heap__ { };
|
define block HEAP with alignment = 8, size = __size_heap__ { };
|
||||||
define block STACKHEAP with fixed order { block HEAP, block CSTACK };
|
define block STACKHEAP with fixed order { block HEAP, block CSTACK };
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@ define region ROM_region = mem:[from __region_ROM_start__ to __region_ROM_end__]
|
||||||
define region RAM_region = mem:[from __region_RAM_start__ to __region_RAM_end__];
|
define region RAM_region = mem:[from __region_RAM_start__ to __region_RAM_end__];
|
||||||
|
|
||||||
/* Stack and Heap */
|
/* Stack and Heap */
|
||||||
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __size_cstack__ = 0x1000;
|
define symbol __size_cstack__ = 0x1000;
|
||||||
define symbol __size_heap__ = 0x2000;
|
define symbol __size_heap__ = 0x2000;
|
||||||
define block CSTACK with alignment = 8, size = __size_cstack__ { };
|
define block CSTACK with alignment = 8, size = __size_cstack__ { };
|
||||||
|
|
|
||||||
|
|
@ -15,8 +15,9 @@ define region ROM_region = mem:[from __region_ROM_start__ to __region_ROM_end__]
|
||||||
define region RAM_region = mem:[from __region_RAM_start__ to __region_RAM_end__];
|
define region RAM_region = mem:[from __region_RAM_start__ to __region_RAM_end__];
|
||||||
|
|
||||||
/* Stack and Heap */
|
/* Stack and Heap */
|
||||||
define symbol __size_cstack__ = 0x1000;
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __size_heap__ = 0x1700;
|
define symbol __size_cstack__ = 0x800;
|
||||||
|
define symbol __size_heap__ = 0x1000;
|
||||||
define block CSTACK with alignment = 8, size = __size_cstack__ { };
|
define block CSTACK with alignment = 8, size = __size_cstack__ { };
|
||||||
define block HEAP with alignment = 8, size = __size_heap__ { };
|
define block HEAP with alignment = 8, size = __size_heap__ { };
|
||||||
define block STACKHEAP with fixed order { block HEAP, block CSTACK };
|
define block STACKHEAP with fixed order { block HEAP, block CSTACK };
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,9 @@ define region RAM_region = mem:[from __region_RAM_start__ to __region_RAM_
|
||||||
define region CCMRAM_region = mem:[from __region_CCMRAM_start__ to __region_CCMRAM_end__];
|
define region CCMRAM_region = mem:[from __region_CCMRAM_start__ to __region_CCMRAM_end__];
|
||||||
|
|
||||||
/* Stack and Heap */
|
/* Stack and Heap */
|
||||||
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __size_cstack__ = 0x2000;
|
define symbol __size_cstack__ = 0x2000;
|
||||||
define symbol __size_heap__ = 0x2000;
|
define symbol __size_heap__ = 0x4000;
|
||||||
define block CSTACK with alignment = 8, size = __size_cstack__ { };
|
define block CSTACK with alignment = 8, size = __size_cstack__ { };
|
||||||
define block HEAP with alignment = 8, size = __size_heap__ { };
|
define block HEAP with alignment = 8, size = __size_heap__ { };
|
||||||
define block STACKHEAP with fixed order { block HEAP, block CSTACK };
|
define block STACKHEAP with fixed order { block HEAP, block CSTACK };
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,9 @@ define region RAM_region = mem:[from __region_RAM_start__ to __region_RAM_end__]
|
||||||
define region CCMRAM_region = mem:[from __region_CCMRAM_start__ to __region_CCMRAM_end__];
|
define region CCMRAM_region = mem:[from __region_CCMRAM_start__ to __region_CCMRAM_end__];
|
||||||
|
|
||||||
/* Stack and Heap */
|
/* Stack and Heap */
|
||||||
define symbol __size_cstack__ = 0x800;
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __size_heap__ = 0x1000;
|
define symbol __size_cstack__ = 0x600;
|
||||||
|
define symbol __size_heap__ = 0xC00;
|
||||||
define block CSTACK with alignment = 8, size = __size_cstack__ { };
|
define block CSTACK with alignment = 8, size = __size_cstack__ { };
|
||||||
define block HEAP with alignment = 8, size = __size_heap__ { };
|
define block HEAP with alignment = 8, size = __size_heap__ { };
|
||||||
define block STACKHEAP with fixed order { block HEAP, block CSTACK };
|
define block STACKHEAP with fixed order { block HEAP, block CSTACK };
|
||||||
|
|
|
||||||
|
|
@ -13,8 +13,9 @@ define symbol __ICFEDIT_region_RAM_end__ = 0x2002FFFF;
|
||||||
define symbol __ICFEDIT_region_CCMRAM_start__ = 0x10000000;
|
define symbol __ICFEDIT_region_CCMRAM_start__ = 0x10000000;
|
||||||
define symbol __ICFEDIT_region_CCMRAM_end__ = 0x1000FFFF;
|
define symbol __ICFEDIT_region_CCMRAM_end__ = 0x1000FFFF;
|
||||||
/*-Sizes-*/
|
/*-Sizes-*/
|
||||||
define symbol __ICFEDIT_size_cstack__ = 0x5FFF;
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __ICFEDIT_size_heap__ = 0x5FFF;
|
define symbol __ICFEDIT_size_cstack__ = 0x6000;
|
||||||
|
define symbol __ICFEDIT_size_heap__ = 0xC000;
|
||||||
/**** End of ICF editor section. ###ICF###*/
|
/**** End of ICF editor section. ###ICF###*/
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,8 +15,9 @@ define region ROM_region = mem:[from __region_ROM_start__ to __region_ROM_end__]
|
||||||
define region RAM_region = mem:[from __region_RAM_start__ to __region_RAM_end__];
|
define region RAM_region = mem:[from __region_RAM_start__ to __region_RAM_end__];
|
||||||
|
|
||||||
/* Stack and Heap */
|
/* Stack and Heap */
|
||||||
define symbol __size_cstack__ = 0x400;
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __size_heap__ = 0x400;
|
define symbol __size_cstack__ = 0x4000;
|
||||||
|
define symbol __size_heap__ = 0x8000;
|
||||||
define block CSTACK with alignment = 8, size = __size_cstack__ { };
|
define block CSTACK with alignment = 8, size = __size_cstack__ { };
|
||||||
define block HEAP with alignment = 8, size = __size_heap__ { };
|
define block HEAP with alignment = 8, size = __size_heap__ { };
|
||||||
define block STACKHEAP with fixed order { block HEAP, block CSTACK };
|
define block STACKHEAP with fixed order { block HEAP, block CSTACK };
|
||||||
|
|
|
||||||
|
|
@ -14,8 +14,9 @@ define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF;
|
||||||
define symbol __ICFEDIT_region_CCMRAM_start__ = 0x10000000;
|
define symbol __ICFEDIT_region_CCMRAM_start__ = 0x10000000;
|
||||||
define symbol __ICFEDIT_region_CCMRAM_end__ = 0x1000FFFF;
|
define symbol __ICFEDIT_region_CCMRAM_end__ = 0x1000FFFF;
|
||||||
/*-Sizes-*/
|
/*-Sizes-*/
|
||||||
define symbol __ICFEDIT_size_cstack__ = 0x2000;
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __ICFEDIT_size_heap__ = 0x2000;
|
define symbol __ICFEDIT_size_cstack__ = 0x4000;
|
||||||
|
define symbol __ICFEDIT_size_heap__ = 0x8000;
|
||||||
/**** End of ICF editor section. ###ICF###*/
|
/**** End of ICF editor section. ###ICF###*/
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,8 +15,9 @@ define region ROM_region = mem:[from __region_ROM_start__ to __region_ROM_end__]
|
||||||
define region RAM_region = mem:[from __region_RAM_start__ to __region_RAM_end__];
|
define region RAM_region = mem:[from __region_RAM_start__ to __region_RAM_end__];
|
||||||
|
|
||||||
/* Stack and Heap */
|
/* Stack and Heap */
|
||||||
define symbol __size_cstack__ = 0x400;
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __size_heap__ = 0x400;
|
define symbol __size_cstack__ = 0x4000;
|
||||||
|
define symbol __size_heap__ = 0x8000;
|
||||||
define block CSTACK with alignment = 8, size = __size_cstack__ { };
|
define block CSTACK with alignment = 8, size = __size_cstack__ { };
|
||||||
define block HEAP with alignment = 8, size = __size_heap__ { };
|
define block HEAP with alignment = 8, size = __size_heap__ { };
|
||||||
define block STACKHEAP with fixed order { block HEAP, block CSTACK };
|
define block STACKHEAP with fixed order { block HEAP, block CSTACK };
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,9 @@ define symbol __NVIC_end__ = 0x20000197; /* to be aligned on 8 bytes
|
||||||
define symbol __ICFEDIT_region_RAM_start__ = 0x20000198;
|
define symbol __ICFEDIT_region_RAM_start__ = 0x20000198;
|
||||||
define symbol __ICFEDIT_region_RAM_end__ = 0x20017FFF;
|
define symbol __ICFEDIT_region_RAM_end__ = 0x20017FFF;
|
||||||
/*-Sizes-*/
|
/*-Sizes-*/
|
||||||
define symbol __ICFEDIT_size_cstack__ = 0x2000;
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __ICFEDIT_size_heap__ = 0x2000;
|
define symbol __ICFEDIT_size_cstack__ = 0x3000;
|
||||||
|
define symbol __ICFEDIT_size_heap__ = 0x6000;
|
||||||
/**** End of ICF editor section. ###ICF###*/
|
/**** End of ICF editor section. ###ICF###*/
|
||||||
|
|
||||||
define memory mem with size = 4G;
|
define memory mem with size = 4G;
|
||||||
|
|
|
||||||
|
|
@ -15,8 +15,9 @@ define region ROM_region = mem:[from __region_ROM_start__ to __region_ROM_end__]
|
||||||
define region RAM_region = mem:[from __region_RAM_start__ to __region_RAM_end__];
|
define region RAM_region = mem:[from __region_RAM_start__ to __region_RAM_end__];
|
||||||
|
|
||||||
/* Stack and Heap */
|
/* Stack and Heap */
|
||||||
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __size_cstack__ = 0x4000;
|
define symbol __size_cstack__ = 0x4000;
|
||||||
define symbol __size_heap__ = 0x4000;
|
define symbol __size_heap__ = 0x8000;
|
||||||
define block CSTACK with alignment = 8, size = __size_cstack__ { };
|
define block CSTACK with alignment = 8, size = __size_cstack__ { };
|
||||||
define block HEAP with alignment = 8, size = __size_heap__ { };
|
define block HEAP with alignment = 8, size = __size_heap__ { };
|
||||||
define block STACKHEAP with fixed order { block HEAP, block CSTACK };
|
define block STACKHEAP with fixed order { block HEAP, block CSTACK };
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,9 @@ define symbol __ICFEDIT_region_RAM_end__ = 0x2002FFFF;
|
||||||
define symbol __ICFEDIT_region_CCMRAM_start__ = 0x10000000;
|
define symbol __ICFEDIT_region_CCMRAM_start__ = 0x10000000;
|
||||||
define symbol __ICFEDIT_region_CCMRAM_end__ = 0x1000FFFF;
|
define symbol __ICFEDIT_region_CCMRAM_end__ = 0x1000FFFF;
|
||||||
/*-Sizes-*/
|
/*-Sizes-*/
|
||||||
define symbol __ICFEDIT_size_cstack__ = 0x400;
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __ICFEDIT_size_heap__ = 0x200;
|
define symbol __ICFEDIT_size_cstack__ = 0x6000;
|
||||||
|
define symbol __ICFEDIT_size_heap__ = 0xC000;
|
||||||
/**** End of ICF editor section. ###ICF###*/
|
/**** End of ICF editor section. ###ICF###*/
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,9 @@ define symbol __NVIC_end__ = 0x20000187; /* Aligned on 8 bytes */
|
||||||
define symbol __ICFEDIT_region_RAM_start__ = 0x20000188;
|
define symbol __ICFEDIT_region_RAM_start__ = 0x20000188;
|
||||||
define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF;
|
define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF;
|
||||||
/*-Sizes-*/
|
/*-Sizes-*/
|
||||||
define symbol __ICFEDIT_size_cstack__ = 0x2000;
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __ICFEDIT_size_heap__ = 0x2000;
|
define symbol __ICFEDIT_size_cstack__ = 0x4000;
|
||||||
|
define symbol __ICFEDIT_size_heap__ = 0x8000;
|
||||||
/**** End of ICF editor section. ###ICF###*/
|
/**** End of ICF editor section. ###ICF###*/
|
||||||
|
|
||||||
define symbol __region_RAM1_start__ = 0x10000000;
|
define symbol __region_RAM1_start__ = 0x10000000;
|
||||||
|
|
|
||||||
|
|
@ -15,8 +15,9 @@ define region ROM_region = mem:[from __region_ROM_start__ to __region_ROM_end__]
|
||||||
define region RAM_region = mem:[from __region_RAM_start__ to __region_RAM_end__];
|
define region RAM_region = mem:[from __region_RAM_start__ to __region_RAM_end__];
|
||||||
|
|
||||||
/* Stack and Heap */
|
/* Stack and Heap */
|
||||||
define symbol __size_cstack__ = 0x1000;
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
define symbol __size_heap__ = 0x1000;
|
define symbol __size_cstack__ = 0x2800;
|
||||||
|
define symbol __size_heap__ = 0x5000;
|
||||||
define block CSTACK with alignment = 8, size = __size_cstack__ { };
|
define block CSTACK with alignment = 8, size = __size_cstack__ { };
|
||||||
define block HEAP with alignment = 8, size = __size_heap__ { };
|
define block HEAP with alignment = 8, size = __size_heap__ { };
|
||||||
define block STACKHEAP with fixed order { block HEAP, block CSTACK };
|
define block STACKHEAP with fixed order { block HEAP, block CSTACK };
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,94 @@
|
||||||
|
/* Copyright (c) 2009 - 2012 ARM LIMITED
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
- Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
- Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
- Neither the name of ARM nor the names of its contributors may be used
|
||||||
|
to endorse or promote products derived from this software without
|
||||||
|
specific prior written permission.
|
||||||
|
*
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* Functions
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
.text
|
||||||
|
.global __v7_all_cache
|
||||||
|
/*
|
||||||
|
* __STATIC_ASM void __v7_all_cache(uint32_t op) {
|
||||||
|
*/
|
||||||
|
__v7_all_cache:
|
||||||
|
.arm
|
||||||
|
|
||||||
|
PUSH {R4-R11}
|
||||||
|
|
||||||
|
MRC p15, 1, R6, c0, c0, 1 // Read CLIDR
|
||||||
|
ANDS R3, R6, #0x07000000 // Extract coherency level
|
||||||
|
MOV R3, R3, LSR #23 // Total cache levels << 1
|
||||||
|
BEQ Finished // If 0, no need to clean
|
||||||
|
|
||||||
|
MOV R10, #0 // R10 holds current cache level << 1
|
||||||
|
Loop1: ADD R2, R10, R10, LSR #1 // R2 holds cache "Set" position
|
||||||
|
MOV R1, R6, LSR R2 // Bottom 3 bits are the Cache-type for this level
|
||||||
|
AND R1, R1, #7 // Isolate those lower 3 bits
|
||||||
|
CMP R1, #2
|
||||||
|
BLT Skip // No cache or only instruction cache at this level
|
||||||
|
|
||||||
|
MCR p15, 2, R10, c0, c0, 0 // Write the Cache Size selection register
|
||||||
|
ISB // ISB to sync the change to the CacheSizeID reg
|
||||||
|
MRC p15, 1, R1, c0, c0, 0 // Reads current Cache Size ID register
|
||||||
|
AND R2, R1, #7 // Extract the line length field
|
||||||
|
ADD R2, R2, #4 // Add 4 for the line length offset (log2 16 bytes)
|
||||||
|
LDR R4, =0x3FF
|
||||||
|
ANDS R4, R4, R1, LSR #3 // R4 is the max number on the way size (right aligned)
|
||||||
|
CLZ R5, R4 // R5 is the bit position of the way size increment
|
||||||
|
LDR R7, =0x7FFF
|
||||||
|
ANDS R7, R7, R1, LSR #13 // R7 is the max number of the index size (right aligned)
|
||||||
|
|
||||||
|
Loop2: MOV R9, R4 // R9 working copy of the max way size (right aligned)
|
||||||
|
|
||||||
|
Loop3: ORR R11, R10, R9, LSL R5 // Factor in the Way number and cache number into R11
|
||||||
|
ORR R11, R11, R7, LSL R2 // Factor in the Set number
|
||||||
|
CMP R0, #0
|
||||||
|
BNE Dccsw
|
||||||
|
MCR p15, 0, R11, c7, c6, 2 // DCISW. Invalidate by Set/Way
|
||||||
|
B cont
|
||||||
|
Dccsw: CMP R0, #1
|
||||||
|
BNE Dccisw
|
||||||
|
MCR p15, 0, R11, c7, c10, 2 // DCCSW. Clean by Set/Way
|
||||||
|
B cont
|
||||||
|
Dccisw: MCR p15, 0, R11, c7, c14, 2 // DCCISW, Clean and Invalidate by Set/Way
|
||||||
|
cont: SUBS R9, R9, #1 // Decrement the Way number
|
||||||
|
BGE Loop3
|
||||||
|
SUBS R7, R7, #1 // Decrement the Set number
|
||||||
|
BGE Loop2
|
||||||
|
Skip: ADD R10, R10, #2 // increment the cache number
|
||||||
|
CMP R3, R10
|
||||||
|
BGT Loop1
|
||||||
|
|
||||||
|
Finished:
|
||||||
|
DSB
|
||||||
|
POP {R4-R11}
|
||||||
|
BX lr
|
||||||
|
|
||||||
|
|
||||||
|
.END
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* end of file
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
@ -578,7 +578,576 @@ __STATIC_INLINE void __v7_clean_inv_dcache_all(void) {
|
||||||
|
|
||||||
#elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/
|
#elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/
|
||||||
|
|
||||||
//#error GNU Compiler support not implemented for Cortex-A
|
/* GNU gcc specific functions */
|
||||||
|
|
||||||
|
#define MODE_USR 0x10
|
||||||
|
#define MODE_FIQ 0x11
|
||||||
|
#define MODE_IRQ 0x12
|
||||||
|
#define MODE_SVC 0x13
|
||||||
|
#define MODE_MON 0x16
|
||||||
|
#define MODE_ABT 0x17
|
||||||
|
#define MODE_HYP 0x1A
|
||||||
|
#define MODE_UND 0x1B
|
||||||
|
#define MODE_SYS 0x1F
|
||||||
|
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void)
|
||||||
|
{
|
||||||
|
__ASM volatile ("cpsie i");
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Disable IRQ Interrupts
|
||||||
|
|
||||||
|
This function disables IRQ interrupts by setting the I-bit in the CPSR.
|
||||||
|
Can only be executed in Privileged modes.
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __disable_irq(void)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("mrs %0, cpsr" : "=r" (result));
|
||||||
|
__ASM volatile ("cpsid i");
|
||||||
|
return(result & 0x80);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Get APSR Register
|
||||||
|
|
||||||
|
This function returns the content of the APSR Register.
|
||||||
|
|
||||||
|
\return APSR Register value
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_APSR(void)
|
||||||
|
{
|
||||||
|
#if 1
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("mrs %0, apsr" : "=r" (result) );
|
||||||
|
return (result);
|
||||||
|
#else
|
||||||
|
register uint32_t __regAPSR __ASM("apsr");
|
||||||
|
return(__regAPSR);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Get CPSR Register
|
||||||
|
|
||||||
|
This function returns the content of the CPSR Register.
|
||||||
|
|
||||||
|
\return CPSR Register value
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CPSR(void)
|
||||||
|
{
|
||||||
|
#if 1
|
||||||
|
register uint32_t __regCPSR;
|
||||||
|
__ASM volatile ("mrs %0, cpsr" : "=r" (__regCPSR));
|
||||||
|
#else
|
||||||
|
register uint32_t __regCPSR __ASM("cpsr");
|
||||||
|
#endif
|
||||||
|
return(__regCPSR);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/** \brief Set Stack Pointer
|
||||||
|
|
||||||
|
This function assigns the given value to the current stack pointer.
|
||||||
|
|
||||||
|
\param [in] topOfStack Stack Pointer value to set
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_SP(uint32_t topOfStack)
|
||||||
|
{
|
||||||
|
register uint32_t __regSP __ASM("sp");
|
||||||
|
__regSP = topOfStack;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** \brief Get link register
|
||||||
|
|
||||||
|
This function returns the value of the link register
|
||||||
|
|
||||||
|
\return Value of link register
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_LR(void)
|
||||||
|
{
|
||||||
|
register uint32_t __reglr __ASM("lr");
|
||||||
|
return(__reglr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/** \brief Set link register
|
||||||
|
|
||||||
|
This function sets the value of the link register
|
||||||
|
|
||||||
|
\param [in] lr LR value to set
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_LR(uint32_t lr)
|
||||||
|
{
|
||||||
|
register uint32_t __reglr __ASM("lr");
|
||||||
|
__reglr = lr;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** \brief Set Process Stack Pointer
|
||||||
|
|
||||||
|
This function assigns the given value to the USR/SYS Stack Pointer (PSP).
|
||||||
|
|
||||||
|
\param [in] topOfProcStack USR/SYS Stack Pointer value to set
|
||||||
|
*/
|
||||||
|
extern void __set_PSP(uint32_t topOfProcStack);
|
||||||
|
|
||||||
|
/** \brief Set User Mode
|
||||||
|
|
||||||
|
This function changes the processor state to User Mode
|
||||||
|
|
||||||
|
\param [in] topOfProcStack USR/SYS Stack Pointer value to set
|
||||||
|
*/
|
||||||
|
extern void __set_CPS_USR(void);
|
||||||
|
|
||||||
|
/** \brief Enable FIQ
|
||||||
|
|
||||||
|
This function enables FIQ interrupts by clearing the F-bit in the CPSR.
|
||||||
|
Can only be executed in Privileged modes.
|
||||||
|
*/
|
||||||
|
#define __enable_fault_irq __enable_fiq
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Disable FIQ
|
||||||
|
|
||||||
|
This function disables FIQ interrupts by setting the F-bit in the CPSR.
|
||||||
|
Can only be executed in Privileged modes.
|
||||||
|
*/
|
||||||
|
#define __disable_fault_irq __disable_fiq
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Get FPSCR
|
||||||
|
|
||||||
|
This function returns the current value of the Floating Point Status/Control register.
|
||||||
|
|
||||||
|
\return Floating Point Status/Control register value
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FPSCR(void)
|
||||||
|
{
|
||||||
|
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
|
||||||
|
#if 1
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("vmrs %0, fpscr" : "=r" (result) );
|
||||||
|
return (result);
|
||||||
|
#else
|
||||||
|
register uint32_t __regfpscr __ASM("fpscr");
|
||||||
|
return(__regfpscr);
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
return(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Set FPSCR
|
||||||
|
|
||||||
|
This function assigns the given value to the Floating Point Status/Control register.
|
||||||
|
|
||||||
|
\param [in] fpscr Floating Point Status/Control value to set
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
|
||||||
|
{
|
||||||
|
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
|
||||||
|
#if 1
|
||||||
|
__ASM volatile ("vmsr fpscr, %0" : : "r" (fpscr) );
|
||||||
|
#else
|
||||||
|
register uint32_t __regfpscr __ASM("fpscr");
|
||||||
|
__regfpscr = (fpscr);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Get FPEXC
|
||||||
|
|
||||||
|
This function returns the current value of the Floating Point Exception Control register.
|
||||||
|
|
||||||
|
\return Floating Point Exception Control register value
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FPEXC(void)
|
||||||
|
{
|
||||||
|
#if (__FPU_PRESENT == 1)
|
||||||
|
#if 1
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("vmrs %0, fpexc" : "=r" (result));
|
||||||
|
return (result);
|
||||||
|
#else
|
||||||
|
register uint32_t __regfpexc __ASM("fpexc");
|
||||||
|
return(__regfpexc);
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
return(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Set FPEXC
|
||||||
|
|
||||||
|
This function assigns the given value to the Floating Point Exception Control register.
|
||||||
|
|
||||||
|
\param [in] fpscr Floating Point Exception Control value to set
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPEXC(uint32_t fpexc)
|
||||||
|
{
|
||||||
|
#if (__FPU_PRESENT == 1)
|
||||||
|
#if 1
|
||||||
|
__ASM volatile ("vmsr fpexc, %0" : : "r" (fpexc));
|
||||||
|
#else
|
||||||
|
register uint32_t __regfpexc __ASM("fpexc");
|
||||||
|
__regfpexc = (fpexc);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Get CPACR
|
||||||
|
|
||||||
|
This function returns the current value of the Coprocessor Access Control register.
|
||||||
|
|
||||||
|
\return Coprocessor Access Control register value
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CPACR(void)
|
||||||
|
{
|
||||||
|
#if 1
|
||||||
|
register uint32_t __regCPACR;
|
||||||
|
__ASM volatile ("mrc p15, 0, %0, c1, c0, 2" : "=r" (__regCPACR));
|
||||||
|
#else
|
||||||
|
register uint32_t __regCPACR __ASM("cp15:0:c1:c0:2");
|
||||||
|
#endif
|
||||||
|
return __regCPACR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Set CPACR
|
||||||
|
|
||||||
|
This function assigns the given value to the Coprocessor Access Control register.
|
||||||
|
|
||||||
|
\param [in] cpacr Coporcessor Acccess Control value to set
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_CPACR(uint32_t cpacr)
|
||||||
|
{
|
||||||
|
#if 1
|
||||||
|
__ASM volatile ("mcr p15, 0, %0, c1, c0, 2" : : "r" (cpacr));
|
||||||
|
#else
|
||||||
|
register uint32_t __regCPACR __ASM("cp15:0:c1:c0:2");
|
||||||
|
__regCPACR = cpacr;
|
||||||
|
#endif
|
||||||
|
__ISB();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Get CBAR
|
||||||
|
|
||||||
|
This function returns the value of the Configuration Base Address register.
|
||||||
|
|
||||||
|
\return Configuration Base Address register value
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CBAR() {
|
||||||
|
#if 1
|
||||||
|
register uint32_t __regCBAR;
|
||||||
|
__ASM volatile ("mrc p15, 4, %0, c15, c0, 0" : "=r" (__regCBAR));
|
||||||
|
#else
|
||||||
|
register uint32_t __regCBAR __ASM("cp15:4:c15:c0:0");
|
||||||
|
#endif
|
||||||
|
return(__regCBAR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Get TTBR0
|
||||||
|
|
||||||
|
This function returns the value of the Configuration Base Address register.
|
||||||
|
|
||||||
|
\return Translation Table Base Register 0 value
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_TTBR0() {
|
||||||
|
#if 1
|
||||||
|
register uint32_t __regTTBR0;
|
||||||
|
__ASM volatile ("mrc p15, 0, %0, c2, c0, 0" : "=r" (__regTTBR0));
|
||||||
|
#else
|
||||||
|
register uint32_t __regTTBR0 __ASM("cp15:0:c2:c0:0");
|
||||||
|
#endif
|
||||||
|
return(__regTTBR0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Set TTBR0
|
||||||
|
|
||||||
|
This function assigns the given value to the Coprocessor Access Control register.
|
||||||
|
|
||||||
|
\param [in] ttbr0 Translation Table Base Register 0 value to set
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_TTBR0(uint32_t ttbr0) {
|
||||||
|
#if 1
|
||||||
|
__ASM volatile ("mcr p15, 0, %0, c2, c0, 0" : : "r" (ttbr0));
|
||||||
|
#else
|
||||||
|
register uint32_t __regTTBR0 __ASM("cp15:0:c2:c0:0");
|
||||||
|
__regTTBR0 = ttbr0;
|
||||||
|
#endif
|
||||||
|
__ISB();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Get DACR
|
||||||
|
|
||||||
|
This function returns the value of the Domain Access Control Register.
|
||||||
|
|
||||||
|
\return Domain Access Control Register value
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_DACR() {
|
||||||
|
#if 1
|
||||||
|
register uint32_t __regDACR;
|
||||||
|
__ASM volatile ("mrc p15, 0, %0, c3, c0, 0" : "=r" (__regDACR));
|
||||||
|
#else
|
||||||
|
register uint32_t __regDACR __ASM("cp15:0:c3:c0:0");
|
||||||
|
#endif
|
||||||
|
return(__regDACR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Set DACR
|
||||||
|
|
||||||
|
This function assigns the given value to the Coprocessor Access Control register.
|
||||||
|
|
||||||
|
\param [in] dacr Domain Access Control Register value to set
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_DACR(uint32_t dacr) {
|
||||||
|
#if 1
|
||||||
|
__ASM volatile ("mcr p15, 0, %0, c3, c0, 0" : : "r" (dacr));
|
||||||
|
#else
|
||||||
|
register uint32_t __regDACR __ASM("cp15:0:c3:c0:0");
|
||||||
|
__regDACR = dacr;
|
||||||
|
#endif
|
||||||
|
__ISB();
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************** Cache and BTAC enable ****************************************************/
|
||||||
|
|
||||||
|
/** \brief Set SCTLR
|
||||||
|
|
||||||
|
This function assigns the given value to the System Control Register.
|
||||||
|
|
||||||
|
\param [in] sctlr System Control Register, value to set
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_SCTLR(uint32_t sctlr)
|
||||||
|
{
|
||||||
|
#if 1
|
||||||
|
__ASM volatile ("mcr p15, 0, %0, c1, c0, 0" : : "r" (sctlr));
|
||||||
|
#else
|
||||||
|
register uint32_t __regSCTLR __ASM("cp15:0:c1:c0:0");
|
||||||
|
__regSCTLR = sctlr;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Get SCTLR
|
||||||
|
|
||||||
|
This function returns the value of the System Control Register.
|
||||||
|
|
||||||
|
\return System Control Register value
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_SCTLR() {
|
||||||
|
#if 1
|
||||||
|
register uint32_t __regSCTLR;
|
||||||
|
__ASM volatile ("mrc p15, 0, %0, c1, c0, 0" : "=r" (__regSCTLR));
|
||||||
|
#else
|
||||||
|
register uint32_t __regSCTLR __ASM("cp15:0:c1:c0:0");
|
||||||
|
#endif
|
||||||
|
return(__regSCTLR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Enable Caches
|
||||||
|
|
||||||
|
Enable Caches
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_caches(void) {
|
||||||
|
// Set I bit 12 to enable I Cache
|
||||||
|
// Set C bit 2 to enable D Cache
|
||||||
|
__set_SCTLR( __get_SCTLR() | (1 << 12) | (1 << 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Disable Caches
|
||||||
|
|
||||||
|
Disable Caches
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_caches(void) {
|
||||||
|
// Clear I bit 12 to disable I Cache
|
||||||
|
// Clear C bit 2 to disable D Cache
|
||||||
|
__set_SCTLR( __get_SCTLR() & ~(1 << 12) & ~(1 << 2));
|
||||||
|
__ISB();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Enable BTAC
|
||||||
|
|
||||||
|
Enable BTAC
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_btac(void) {
|
||||||
|
// Set Z bit 11 to enable branch prediction
|
||||||
|
__set_SCTLR( __get_SCTLR() | (1 << 11));
|
||||||
|
__ISB();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Disable BTAC
|
||||||
|
|
||||||
|
Disable BTAC
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_btac(void) {
|
||||||
|
// Clear Z bit 11 to disable branch prediction
|
||||||
|
__set_SCTLR( __get_SCTLR() & ~(1 << 11));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Enable MMU
|
||||||
|
|
||||||
|
Enable MMU
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_mmu(void) {
|
||||||
|
// Set M bit 0 to enable the MMU
|
||||||
|
// Set AFE bit to enable simplified access permissions model
|
||||||
|
// Clear TRE bit to disable TEX remap and A bit to disable strict alignment fault checking
|
||||||
|
__set_SCTLR( (__get_SCTLR() & ~(1 << 28) & ~(1 << 1)) | 1 | (1 << 29));
|
||||||
|
__ISB();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Enable MMU
|
||||||
|
|
||||||
|
Enable MMU
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_mmu(void) {
|
||||||
|
// Clear M bit 0 to disable the MMU
|
||||||
|
__set_SCTLR( __get_SCTLR() & ~1);
|
||||||
|
__ISB();
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************** TLB maintenance operations ************************************************/
|
||||||
|
/** \brief Invalidate the whole tlb
|
||||||
|
|
||||||
|
TLBIALL. Invalidate the whole tlb
|
||||||
|
*/
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __ca9u_inv_tlb_all(void) {
|
||||||
|
#if 1
|
||||||
|
__ASM volatile ("mcr p15, 0, %0, c8, c7, 0" : : "r" (0));
|
||||||
|
#else
|
||||||
|
register uint32_t __TLBIALL __ASM("cp15:0:c8:c7:0");
|
||||||
|
__TLBIALL = 0;
|
||||||
|
#endif
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************** BTB maintenance operations ************************************************/
|
||||||
|
/** \brief Invalidate entire branch predictor array
|
||||||
|
|
||||||
|
BPIALL. Branch Predictor Invalidate All.
|
||||||
|
*/
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __v7_inv_btac(void) {
|
||||||
|
#if 1
|
||||||
|
__ASM volatile ("mcr p15, 0, %0, c7, c5, 6" : : "r" (0));
|
||||||
|
#else
|
||||||
|
register uint32_t __BPIALL __ASM("cp15:0:c7:c5:6");
|
||||||
|
__BPIALL = 0;
|
||||||
|
#endif
|
||||||
|
__DSB(); //ensure completion of the invalidation
|
||||||
|
__ISB(); //ensure instruction fetch path sees new state
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/******************************** L1 cache operations ******************************************************/
|
||||||
|
|
||||||
|
/** \brief Invalidate the whole I$
|
||||||
|
|
||||||
|
ICIALLU. Instruction Cache Invalidate All to PoU
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __v7_inv_icache_all(void) {
|
||||||
|
#if 1
|
||||||
|
__ASM volatile ("mcr p15, 0, %0, c7, c5, 0" : : "r" (0));
|
||||||
|
#else
|
||||||
|
register uint32_t __ICIALLU __ASM("cp15:0:c7:c5:0");
|
||||||
|
__ICIALLU = 0;
|
||||||
|
#endif
|
||||||
|
__DSB(); //ensure completion of the invalidation
|
||||||
|
__ISB(); //ensure instruction fetch path sees new I cache state
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Clean D$ by MVA
|
||||||
|
|
||||||
|
DCCMVAC. Data cache clean by MVA to PoC
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __v7_clean_dcache_mva(void *va) {
|
||||||
|
#if 1
|
||||||
|
__ASM volatile ("mcr p15, 0, %0, c7, c10, 1" : : "r" ((uint32_t)va));
|
||||||
|
#else
|
||||||
|
register uint32_t __DCCMVAC __ASM("cp15:0:c7:c10:1");
|
||||||
|
__DCCMVAC = (uint32_t)va;
|
||||||
|
#endif
|
||||||
|
__DMB(); //ensure the ordering of data cache maintenance operations and their effects
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Invalidate D$ by MVA
|
||||||
|
|
||||||
|
DCIMVAC. Data cache invalidate by MVA to PoC
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __v7_inv_dcache_mva(void *va) {
|
||||||
|
#if 1
|
||||||
|
__ASM volatile ("mcr p15, 0, %0, c7, c6, 1" : : "r" ((uint32_t)va));
|
||||||
|
#else
|
||||||
|
register uint32_t __DCIMVAC __ASM("cp15:0:c7:c6:1");
|
||||||
|
__DCIMVAC = (uint32_t)va;
|
||||||
|
#endif
|
||||||
|
__DMB(); //ensure the ordering of data cache maintenance operations and their effects
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Clean and Invalidate D$ by MVA
|
||||||
|
|
||||||
|
DCCIMVAC. Data cache clean and invalidate by MVA to PoC
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __v7_clean_inv_dcache_mva(void *va) {
|
||||||
|
#if 1
|
||||||
|
__ASM volatile ("mcr p15, 0, %0, c7, c14, 1" : : "r" ((uint32_t)va));
|
||||||
|
#else
|
||||||
|
register uint32_t __DCCIMVAC __ASM("cp15:0:c7:c14:1");
|
||||||
|
__DCCIMVAC = (uint32_t)va;
|
||||||
|
#endif
|
||||||
|
__DMB(); //ensure the ordering of data cache maintenance operations and their effects
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief
|
||||||
|
* Generic mechanism for cleaning/invalidating the entire data or unified cache to the point of coherency.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \brief __v7_all_cache - helper function
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern void __v7_all_cache(uint32_t op);
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Invalidate the whole D$
|
||||||
|
|
||||||
|
DCISW. Invalidate by Set/Way
|
||||||
|
*/
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __v7_inv_dcache_all(void) {
|
||||||
|
__v7_all_cache(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Clean the whole D$
|
||||||
|
|
||||||
|
DCCSW. Clean by Set/Way
|
||||||
|
*/
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __v7_clean_dcache_all(void) {
|
||||||
|
__v7_all_cache(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Clean and invalidate the whole D$
|
||||||
|
|
||||||
|
DCCISW. Clean and Invalidate by Set/Way
|
||||||
|
*/
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __v7_clean_inv_dcache_all(void) {
|
||||||
|
__v7_all_cache(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "core_ca_mmu.h"
|
||||||
|
|
||||||
#elif (defined (__TASKING__)) /*--------------- TASKING Compiler -----------------*/
|
#elif (defined (__TASKING__)) /*--------------- TASKING Compiler -----------------*/
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -234,8 +234,8 @@ typedef enum {
|
||||||
A1 = PTB3,
|
A1 = PTB3,
|
||||||
A2 = PTB10,
|
A2 = PTB10,
|
||||||
A3 = PTB11,
|
A3 = PTB11,
|
||||||
A4 = PTC10,
|
A4 = PTC11,
|
||||||
A5 = PTC11,
|
A5 = PTC10,
|
||||||
|
|
||||||
DAC0_OUT = 0xFEFE, /* DAC does not have Pin Name in RM */
|
DAC0_OUT = 0xFEFE, /* DAC does not have Pin Name in RM */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@
|
||||||
#define DEVICE_SERIAL_FC 1
|
#define DEVICE_SERIAL_FC 1
|
||||||
|
|
||||||
#define DEVICE_I2C 1
|
#define DEVICE_I2C 1
|
||||||
#define DEVICE_I2CSLAVE 0
|
#define DEVICE_I2CSLAVE 1
|
||||||
|
|
||||||
#define DEVICE_SPI 1
|
#define DEVICE_SPI 1
|
||||||
#define DEVICE_SPISLAVE 1
|
#define DEVICE_SPISLAVE 1
|
||||||
|
|
@ -40,7 +40,7 @@
|
||||||
|
|
||||||
#define DEVICE_ETHERNET 0
|
#define DEVICE_ETHERNET 0
|
||||||
|
|
||||||
#define DEVICE_PWMOUT 0
|
#define DEVICE_PWMOUT 1
|
||||||
|
|
||||||
#define DEVICE_SEMIHOST 0
|
#define DEVICE_SEMIHOST 0
|
||||||
#define DEVICE_LOCALFILESYSTEM 0
|
#define DEVICE_LOCALFILESYSTEM 0
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,11 @@ struct spi_s {
|
||||||
unsigned char spi_n;
|
unsigned char spi_n;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct pwmout_s {
|
||||||
|
LPC_SCT_TypeDef* pwm;
|
||||||
|
uint32_t pwm_ch;
|
||||||
|
};
|
||||||
|
|
||||||
#include "gpio_object.h"
|
#include "gpio_object.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,226 @@
|
||||||
|
/* mbed Microcontroller Library
|
||||||
|
* Copyright (c) 2006-2013 ARM Limited
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
#include "mbed_assert.h"
|
||||||
|
#include "pwmout_api.h"
|
||||||
|
#include "cmsis.h"
|
||||||
|
#include "pinmap.h"
|
||||||
|
#include "mbed_error.h"
|
||||||
|
|
||||||
|
// Ported from LPC824 and adapted.
|
||||||
|
|
||||||
|
#if DEVICE_PWMOUT
|
||||||
|
|
||||||
|
#define PWM_IRQn SCT_IRQn
|
||||||
|
|
||||||
|
// Bit flags for used SCT Outputs
|
||||||
|
static unsigned char sct_used = 0;
|
||||||
|
static int sct_inited = 0;
|
||||||
|
|
||||||
|
// Find available output channel
|
||||||
|
// Max number of PWM outputs is 4 on LPC812
|
||||||
|
static int get_available_sct() {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
// Find available output channel 0..3
|
||||||
|
// Also need one Match register per channel
|
||||||
|
for (i = 0; i < CONFIG_SCT_nOU; i++) {
|
||||||
|
// for (i = 0; i < 4; i++) {
|
||||||
|
if ((sct_used & (1 << i)) == 0)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Any Port pin may be used for PWM.
|
||||||
|
// Max number of PWM outputs is 4
|
||||||
|
void pwmout_init(pwmout_t* obj, PinName pin) {
|
||||||
|
MBED_ASSERT(pin != (uint32_t)NC);
|
||||||
|
|
||||||
|
int sct_n = get_available_sct();
|
||||||
|
if (sct_n == -1) {
|
||||||
|
error("No available SCT Output");
|
||||||
|
}
|
||||||
|
|
||||||
|
sct_used |= (1 << sct_n);
|
||||||
|
|
||||||
|
obj->pwm = (LPC_SCT_TypeDef*)LPC_SCT;
|
||||||
|
obj->pwm_ch = sct_n;
|
||||||
|
|
||||||
|
LPC_SCT_TypeDef* pwm = obj->pwm;
|
||||||
|
|
||||||
|
// Init SCT on first use
|
||||||
|
if (! sct_inited) {
|
||||||
|
sct_inited = 1;
|
||||||
|
|
||||||
|
// Enable the SCT clock
|
||||||
|
LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 8);
|
||||||
|
|
||||||
|
// Clear peripheral reset the SCT:
|
||||||
|
LPC_SYSCON->PRESETCTRL |= (1 << 8);
|
||||||
|
|
||||||
|
// Two 16-bit counters, autolimit (ie reset on Match_0)
|
||||||
|
pwm->CONFIG &= ~(0x1);
|
||||||
|
pwm->CONFIG |= (1 << 17);
|
||||||
|
|
||||||
|
// halt and clear the counter
|
||||||
|
pwm->CTRL_L |= (1 << 2) | (1 << 3);
|
||||||
|
|
||||||
|
// System Clock (30 Mhz) -> Prescaler -> us_ticker (1 MHz)
|
||||||
|
pwm->CTRL_L &= ~(0x7F << 5);
|
||||||
|
pwm->CTRL_L |= (((SystemCoreClock/1000000 - 1) & 0x7F) << 5);
|
||||||
|
|
||||||
|
pwm->EVENT[0].CTRL = (1 << 12) | 0; // Event_0 on Match_0
|
||||||
|
pwm->EVENT[0].STATE = 0xFFFFFFFF; // All states
|
||||||
|
|
||||||
|
// unhalt the counter:
|
||||||
|
// - clearing bit 2 of the CTRL register
|
||||||
|
pwm->CTRL_L &= ~(1 << 2);
|
||||||
|
|
||||||
|
// Not using IRQs
|
||||||
|
//NVIC_SetVector(PWM_IRQn, (uint32_t)pwm_irq_handler);
|
||||||
|
//NVIC_EnableIRQ(PWM_IRQn);
|
||||||
|
}
|
||||||
|
|
||||||
|
// LPC81x has only one SCT and 4 Outputs
|
||||||
|
// LPC82x has only one SCT and 6 Outputs
|
||||||
|
// LPC1549 has 4 SCTs and 16 Outputs
|
||||||
|
switch(sct_n) {
|
||||||
|
case 0:
|
||||||
|
// SCTx_OUT0
|
||||||
|
LPC_SWM->PINASSIGN[6] &= ~0xFF000000;
|
||||||
|
LPC_SWM->PINASSIGN[6] |= (pin << 24);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
// SCTx_OUT1
|
||||||
|
LPC_SWM->PINASSIGN[7] &= ~0x000000FF;
|
||||||
|
LPC_SWM->PINASSIGN[7] |= (pin);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
// SCTx_OUT2
|
||||||
|
LPC_SWM->PINASSIGN[7] &= ~0x0000FF00;
|
||||||
|
LPC_SWM->PINASSIGN[7] |= (pin << 8);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
// SCTx_OUT3
|
||||||
|
LPC_SWM->PINASSIGN[7] &= ~0x00FF0000;
|
||||||
|
LPC_SWM->PINASSIGN[7] |= (pin << 16);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
pwm->EVENT[sct_n + 1].CTRL = (1 << 12) | (sct_n + 1); // Event_n on Match_n
|
||||||
|
pwm->EVENT[sct_n + 1].STATE = 0xFFFFFFFF; // All states
|
||||||
|
|
||||||
|
pwm->OUT[sct_n].SET = (1 << 0); // All PWM channels are SET on Event_0
|
||||||
|
pwm->OUT[sct_n].CLR = (1 << (sct_n + 1)); // PWM ch is CLRed on Event_(ch+1)
|
||||||
|
|
||||||
|
// default to 20ms: standard for servos, and fine for e.g. brightness control
|
||||||
|
pwmout_period_ms(obj, 20); // 20ms period
|
||||||
|
pwmout_write (obj, 0.0); // 0ms pulsewidth, dutycycle 0
|
||||||
|
}
|
||||||
|
|
||||||
|
void pwmout_free(pwmout_t* obj) {
|
||||||
|
// PWM channel is now free
|
||||||
|
sct_used &= ~(1 << obj->pwm_ch);
|
||||||
|
|
||||||
|
// Disable the SCT clock when all channels free
|
||||||
|
if (sct_used == 0) {
|
||||||
|
LPC_SYSCON->SYSAHBCLKCTRL &= ~(1 << 8);
|
||||||
|
sct_inited = 0;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set new dutycycle (0.0 .. 1.0)
|
||||||
|
void pwmout_write(pwmout_t* obj, float value) {
|
||||||
|
//value is new dutycycle
|
||||||
|
if (value < 0.0f) {
|
||||||
|
value = 0.0;
|
||||||
|
} else if (value > 1.0f) {
|
||||||
|
value = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Match_0 is PWM period. Compute new endtime of pulse for current channel
|
||||||
|
uint32_t t_off = (uint32_t)((float)(obj->pwm->MATCHREL[0].L) * value);
|
||||||
|
obj->pwm->MATCHREL[(obj->pwm_ch) + 1].L = t_off; // New endtime
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get dutycycle (0.0 .. 1.0)
|
||||||
|
float pwmout_read(pwmout_t* obj) {
|
||||||
|
uint32_t t_period = obj->pwm->MATCHREL[0].L;
|
||||||
|
|
||||||
|
//Sanity check
|
||||||
|
if (t_period == 0) {
|
||||||
|
return 0.0;
|
||||||
|
};
|
||||||
|
|
||||||
|
uint32_t t_off = obj->pwm->MATCHREL[(obj->pwm_ch) + 1].L;
|
||||||
|
float v = (float)t_off/(float)t_period;
|
||||||
|
//Sanity check
|
||||||
|
return (v > 1.0f) ? (1.0f) : (v);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the PWM period, keeping the duty cycle the same (for this channel only!).
|
||||||
|
void pwmout_period(pwmout_t* obj, float seconds){
|
||||||
|
pwmout_period_us(obj, seconds * 1000000.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the PWM period, keeping the duty cycle the same (for this channel only!).
|
||||||
|
void pwmout_period_ms(pwmout_t* obj, int ms) {
|
||||||
|
pwmout_period_us(obj, ms * 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the PWM period, keeping the duty cycle the same (for this channel only!).
|
||||||
|
void pwmout_period_us(pwmout_t* obj, int us) {
|
||||||
|
|
||||||
|
uint32_t t_period = obj->pwm->MATCHREL[0].L; // Current PWM period
|
||||||
|
obj->pwm->MATCHREL[0].L = (uint64_t)us; // New PWM period
|
||||||
|
|
||||||
|
//Keep the dutycycle for the new PWM period
|
||||||
|
//Should really do this for all active channels!!
|
||||||
|
//This problem exists in all mbed libs.
|
||||||
|
|
||||||
|
//Sanity check
|
||||||
|
if (t_period == 0) {
|
||||||
|
return;
|
||||||
|
// obj->pwm->MATCHREL[(obj->pwm_ch) + 1].L = 0; // New endtime for this channel
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
uint32_t t_off = obj->pwm->MATCHREL[(obj->pwm_ch) + 1].L;
|
||||||
|
float v = (float)t_off/(float)t_period;
|
||||||
|
obj->pwm->MATCHREL[(obj->pwm_ch) + 1].L = (uint64_t)((float)us * (float)v); // New endtime for this channel
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Set pulsewidth
|
||||||
|
void pwmout_pulsewidth(pwmout_t* obj, float seconds) {
|
||||||
|
pwmout_pulsewidth_us(obj, seconds * 1000000.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Set pulsewidth
|
||||||
|
void pwmout_pulsewidth_ms(pwmout_t* obj, int ms){
|
||||||
|
pwmout_pulsewidth_us(obj, ms * 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Set pulsewidth
|
||||||
|
void pwmout_pulsewidth_us(pwmout_t* obj, int us) {
|
||||||
|
|
||||||
|
//Should add Sanity check to make sure pulsewidth < period!
|
||||||
|
obj->pwm->MATCHREL[(obj->pwm_ch) + 1].L = (uint64_t)us; // New endtime for this channel
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -17,77 +17,105 @@
|
||||||
#include "us_ticker_api.h"
|
#include "us_ticker_api.h"
|
||||||
#include "PeripheralNames.h"
|
#include "PeripheralNames.h"
|
||||||
|
|
||||||
#define US_TICKER_TIMER_IRQn SCT_IRQn
|
//New, using MRT instead of SCT, needed to free up SCT for PWM
|
||||||
|
//Ported from LPC824 libs
|
||||||
|
static int us_ticker_inited = 0;
|
||||||
|
unsigned int ticker_fullcount_us;
|
||||||
|
unsigned long int ticker_expired_count_us = 0;
|
||||||
|
int MRT_Clock_MHz;
|
||||||
|
|
||||||
int us_ticker_inited = 0;
|
#define US_TICKER_TIMER_IRQn MRT_IRQn
|
||||||
|
|
||||||
void us_ticker_init(void) {
|
void us_ticker_init(void) {
|
||||||
if (us_ticker_inited) return;
|
|
||||||
|
if (us_ticker_inited)
|
||||||
|
return;
|
||||||
|
|
||||||
us_ticker_inited = 1;
|
us_ticker_inited = 1;
|
||||||
|
|
||||||
// Enable the SCT clock
|
// Calculate MRT clock value (MRT has no prescaler)
|
||||||
LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 8);
|
MRT_Clock_MHz = (SystemCoreClock / 1000000);
|
||||||
|
// Calculate fullcounter value in us (MRT has 31 bits and clock is 30 MHz)
|
||||||
// Clear peripheral reset the SCT:
|
ticker_fullcount_us = 0x80000000UL/MRT_Clock_MHz;
|
||||||
LPC_SYSCON->PRESETCTRL |= (1 << 8);
|
|
||||||
|
// Enable the MRT clock
|
||||||
// Unified counter (32 bits)
|
LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 10);
|
||||||
LPC_SCT->CONFIG |= 1;
|
|
||||||
|
// Clear peripheral reset the MRT
|
||||||
// halt and clear the counter
|
LPC_SYSCON->PRESETCTRL |= (1 << 7);
|
||||||
LPC_SCT->CTRL_L |= (1 << 2) | (1 << 3);
|
|
||||||
|
// Force load interval value (Bit 0-30 is interval value, Bit 31 is Force Load bit)
|
||||||
// System Clock (12)MHz -> us_ticker (1)MHz
|
LPC_MRT->INTVAL0 = 0xFFFFFFFFUL;
|
||||||
LPC_SCT->CTRL_L |= ((SystemCoreClock/1000000 - 1) << 5);
|
// Enable Ch0 interrupt, Mode 0 is Repeat Interrupt
|
||||||
|
LPC_MRT->CTRL0 = (0x0 << 1) | (0x1 << 0);
|
||||||
// unhalt the counter:
|
|
||||||
// - clearing bit 2 of the CTRL register
|
// Force load interval value (Bit 0-30 is interval value, Bit 31 is Force Load bit)
|
||||||
LPC_SCT->CTRL_L &= ~(1 << 2);
|
LPC_MRT->INTVAL1 = 0x80000000UL;
|
||||||
|
// Disable ch1 interrupt, Mode 0 is Repeat Interrupt
|
||||||
|
LPC_MRT->CTRL1 = (0x0 << 1) | (0x0 << 0);
|
||||||
|
|
||||||
|
// Set MRT interrupt vector
|
||||||
NVIC_SetVector(US_TICKER_TIMER_IRQn, (uint32_t)us_ticker_irq_handler);
|
NVIC_SetVector(US_TICKER_TIMER_IRQn, (uint32_t)us_ticker_irq_handler);
|
||||||
NVIC_EnableIRQ(US_TICKER_TIMER_IRQn);
|
NVIC_EnableIRQ(US_TICKER_TIMER_IRQn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TIMER0 is used for us ticker and timers (Timer, wait(), wait_us() etc)
|
||||||
uint32_t us_ticker_read() {
|
uint32_t us_ticker_read() {
|
||||||
|
|
||||||
if (!us_ticker_inited)
|
if (!us_ticker_inited)
|
||||||
us_ticker_init();
|
us_ticker_init();
|
||||||
|
|
||||||
return LPC_SCT->COUNT_U;
|
// Generate ticker value
|
||||||
|
// MRT source clock is SystemCoreClock (30MHz) and MRT is a 31-bit countdown timer
|
||||||
|
// Calculate expected value using current count and number of expired times to mimic a 32bit timer @ 1 MHz
|
||||||
|
//
|
||||||
|
// ticker_expired_count_us
|
||||||
|
// The variable ticker_expired_count_us keeps track of the number of 31bits overflows (counted by TIMER0) and
|
||||||
|
// corrects that back to us counts.
|
||||||
|
//
|
||||||
|
// (0x7FFFFFFFUL - LPC_MRT->TIMER0)/MRT_Clock_MHz
|
||||||
|
// The counter is a 31bit downcounter from 7FFFFFFF so correct to actual count-up value and correct
|
||||||
|
// for 30 counts per us.
|
||||||
|
//
|
||||||
|
// Added up these 2 parts result in current us time returned as 32 bits.
|
||||||
|
return (0x7FFFFFFFUL - LPC_MRT->TIMER0)/MRT_Clock_MHz + ticker_expired_count_us;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TIMER1 is used for Timestamped interrupts (Ticker(), Timeout())
|
||||||
void us_ticker_set_interrupt(timestamp_t timestamp) {
|
void us_ticker_set_interrupt(timestamp_t timestamp) {
|
||||||
// halt the counter:
|
|
||||||
// - setting bit 2 of the CTRL register
|
|
||||||
LPC_SCT->CTRL_L |= (1 << 2);
|
|
||||||
|
|
||||||
// set timestamp in compare register
|
// MRT source clock is SystemCoreClock (30MHz) and MRT is a 31-bit countdown timer
|
||||||
LPC_SCT->MATCH[0].U = (uint32_t)timestamp;
|
// Force load interval value (Bit 0-30 is interval value, Bit 31 is Force Load bit)
|
||||||
|
// Note: The MRT has less counter headroom available than the typical mbed 32bit timer @ 1 MHz.
|
||||||
|
// The calculated counter interval until the next timestamp will be truncated and an
|
||||||
|
// 'early' interrupt will be generated in case the max required count interval exceeds
|
||||||
|
// the available 31 bits space. However, the mbed us_ticker interrupt handler will
|
||||||
|
// check current time against the next scheduled timestamp and simply re-issue the
|
||||||
|
// same interrupt again when needed. The calculated counter interval will now be smaller.
|
||||||
|
LPC_MRT->INTVAL1 = (((timestamp - us_ticker_read()) * MRT_Clock_MHz) | 0x80000000UL);
|
||||||
|
|
||||||
// unhalt the counter:
|
// Enable interrupt
|
||||||
// - clearing bit 2 of the CTRL register
|
LPC_MRT->CTRL1 |= 1;
|
||||||
LPC_SCT->CTRL_L &= ~(1 << 2);
|
}
|
||||||
|
|
||||||
|
//Disable Timestamped interrupts triggered by TIMER1
|
||||||
|
void us_ticker_disable_interrupt() {
|
||||||
|
//Timer1 for Timestamped interrupts (31 bits downcounter @ SystemCoreClock)
|
||||||
|
LPC_MRT->CTRL1 &= ~1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void us_ticker_clear_interrupt() {
|
||||||
|
|
||||||
// if events are not enabled, enable them
|
//Timer1 for Timestamped interrupts (31 bits downcounter @ SystemCoreClock)
|
||||||
if (!(LPC_SCT->EVEN & 0x01)) {
|
if (LPC_MRT->STAT1 & 1)
|
||||||
|
LPC_MRT->STAT1 = 1;
|
||||||
// comb mode = match only
|
|
||||||
LPC_SCT->EVENT[0].CTRL = (1 << 12);
|
//Timer0 for us counter (31 bits downcounter @ SystemCoreClock)
|
||||||
|
if (LPC_MRT->STAT0 & 1) {
|
||||||
// ref manual:
|
LPC_MRT->STAT0 = 1;
|
||||||
// In simple applications that do not
|
// ticker_expired_count_us = (ticker_expired * 0x80000000UL) / MRT_Clock_MHz
|
||||||
// use states, write 0x01 to this
|
// The variable ticker_expired_count_us keeps track of the number of 31bits overflows (counted by TIMER0) and
|
||||||
// register to enable an event
|
// the multiplication/division corrects that back to us counts.
|
||||||
LPC_SCT->EVENT[0].STATE |= 0x1;
|
ticker_expired_count_us += ticker_fullcount_us;
|
||||||
|
|
||||||
// enable events
|
|
||||||
LPC_SCT->EVEN |= 0x1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void us_ticker_disable_interrupt(void) {
|
|
||||||
LPC_SCT->EVEN &= ~1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void us_ticker_clear_interrupt(void) {
|
|
||||||
LPC_SCT->EVFLAG = 1;
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@
|
||||||
/* ->Take measures about optimization problems of web compiler */
|
/* ->Take measures about optimization problems of web compiler */
|
||||||
/* Web compiler has problem that inlining code may not be generated correctly */
|
/* Web compiler has problem that inlining code may not be generated correctly */
|
||||||
/* when "-O3 -Otime" was specified. */
|
/* when "-O3 -Otime" was specified. */
|
||||||
#if defined(__arm__) && (__ARMCC_VERSION <= 5040027)
|
#if defined(__CC_ARM) && (__ARMCC_VERSION <= 5040027)
|
||||||
#pragma Ospace
|
#pragma Ospace
|
||||||
#endif
|
#endif
|
||||||
/* <-Take measures about optimization problems of web compiler */
|
/* <-Take measures about optimization problems of web compiler */
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,6 @@
|
||||||
#define NUM_OF_RX_DESCRIPTOR (16)
|
#define NUM_OF_RX_DESCRIPTOR (16)
|
||||||
#define SIZE_OF_BUFFER (1600) /* Must be an integral multiple of 32 */
|
#define SIZE_OF_BUFFER (1600) /* Must be an integral multiple of 32 */
|
||||||
#define MAX_SEND_SIZE (1514)
|
#define MAX_SEND_SIZE (1514)
|
||||||
#define BUFF_BOUNDARY_MSK (0x0000000F)
|
|
||||||
/* Ethernet Descriptor Value Define */
|
/* Ethernet Descriptor Value Define */
|
||||||
#define TD0_TFP_TOP_BOTTOM (0x30000000)
|
#define TD0_TFP_TOP_BOTTOM (0x30000000)
|
||||||
#define TD0_TACT (0x80000000)
|
#define TD0_TACT (0x80000000)
|
||||||
|
|
@ -105,14 +104,13 @@ typedef struct tag_edmac_recv_desc {
|
||||||
} edmac_recv_desc_t;
|
} edmac_recv_desc_t;
|
||||||
|
|
||||||
/* memory */
|
/* memory */
|
||||||
#pragma arm section zidata="NC_BSS"
|
|
||||||
/* The whole transmit/receive descriptors (must be allocated in 16-byte boundaries) */
|
/* The whole transmit/receive descriptors (must be allocated in 16-byte boundaries) */
|
||||||
/* Transmit/receive buffers (must be allocated in 16-byte boundaries) */
|
/* Transmit/receive buffers (must be allocated in 16-byte boundaries) */
|
||||||
static uint8_t ehernet_nc_memory[(sizeof(edmac_send_desc_t) * NUM_OF_TX_DESCRIPTOR) +
|
static uint8_t ehernet_nc_memory[(sizeof(edmac_send_desc_t) * NUM_OF_TX_DESCRIPTOR) +
|
||||||
(sizeof(edmac_recv_desc_t) * NUM_OF_RX_DESCRIPTOR) +
|
(sizeof(edmac_recv_desc_t) * NUM_OF_RX_DESCRIPTOR) +
|
||||||
(NUM_OF_TX_DESCRIPTOR * SIZE_OF_BUFFER) +
|
(NUM_OF_TX_DESCRIPTOR * SIZE_OF_BUFFER) +
|
||||||
(NUM_OF_RX_DESCRIPTOR * SIZE_OF_BUFFER) + BUFF_BOUNDARY_MSK];
|
(NUM_OF_RX_DESCRIPTOR * SIZE_OF_BUFFER)]
|
||||||
#pragma arm section zidata
|
__attribute((section("NC_BSS"),aligned(16))); //16 bytes aligned!
|
||||||
static int32_t rx_read_offset; /* read offset */
|
static int32_t rx_read_offset; /* read offset */
|
||||||
static int32_t tx_wite_offset; /* write offset */
|
static int32_t tx_wite_offset; /* write offset */
|
||||||
static uint32_t send_top_index;
|
static uint32_t send_top_index;
|
||||||
|
|
@ -489,7 +487,7 @@ static void lan_desc_create(void) {
|
||||||
uint8_t *p_memory_top;
|
uint8_t *p_memory_top;
|
||||||
|
|
||||||
(void)memset((void *)ehernet_nc_memory, 0, sizeof(ehernet_nc_memory));
|
(void)memset((void *)ehernet_nc_memory, 0, sizeof(ehernet_nc_memory));
|
||||||
p_memory_top = (uint8_t *)(((uint32_t)ehernet_nc_memory + BUFF_BOUNDARY_MSK) & ~BUFF_BOUNDARY_MSK);
|
p_memory_top = ehernet_nc_memory;
|
||||||
|
|
||||||
/* Descriptor area configuration */
|
/* Descriptor area configuration */
|
||||||
p_eth_desc_dsend = (edmac_send_desc_t *)p_memory_top;
|
p_eth_desc_dsend = (edmac_send_desc_t *)p_memory_top;
|
||||||
|
|
|
||||||
|
|
@ -17,4 +17,4 @@ typedef struct tag_ethernet_cfg {
|
||||||
extern int ethernetext_init(ethernet_cfg_t *p_ethcfg);
|
extern int ethernetext_init(ethernet_cfg_t *p_ethcfg);
|
||||||
extern void ethernetext_start_stop(int32_t mode);
|
extern void ethernetext_start_stop(int32_t mode);
|
||||||
extern int ethernetext_chk_link_mode(void);
|
extern int ethernetext_chk_link_mode(void);
|
||||||
extern void ethernetext_set_link_mode(int link);
|
extern void ethernetext_set_link_mode(int32_t link);
|
||||||
|
|
|
||||||
|
|
@ -199,12 +199,13 @@ void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable) {
|
||||||
GIC_DisableIRQ((IRQn_Type)(nIRQn_h+obj->ch));
|
GIC_DisableIRQ((IRQn_Type)(nIRQn_h+obj->ch));
|
||||||
/* Clear Interrupt flags */
|
/* Clear Interrupt flags */
|
||||||
INTCIRQRR &= ~(1 << obj->ch);
|
INTCIRQRR &= ~(1 << obj->ch);
|
||||||
|
INTCICR1 = work_icr_val;
|
||||||
} else if (obj->int_enable == 1) {
|
} else if (obj->int_enable == 1) {
|
||||||
|
INTCICR1 = work_icr_val;
|
||||||
GIC_EnableIRQ((IRQn_Type)(nIRQn_h + obj->ch));
|
GIC_EnableIRQ((IRQn_Type)(nIRQn_h + obj->ch));
|
||||||
} else {
|
} else {
|
||||||
/* Do Nothing */
|
INTCICR1 = work_icr_val;
|
||||||
}
|
}
|
||||||
INTCICR1 = work_icr_val;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void gpio_irq_enable(gpio_irq_t *obj) {
|
void gpio_irq_enable(gpio_irq_t *obj) {
|
||||||
|
|
|
||||||
|
|
@ -247,7 +247,7 @@ inline int i2c_start(i2c_t *obj) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline int i2c_restart(i2c_t *obj) {
|
static inline int i2c_restart(i2c_t *obj) {
|
||||||
/* SR2.START = 0 */
|
/* SR2.START = 0 */
|
||||||
REG(SR2.UINT32) &= ~SR2_START;
|
REG(SR2.UINT32) &= ~SR2_START;
|
||||||
/* ReStart condition */
|
/* ReStart condition */
|
||||||
|
|
|
||||||
|
|
@ -235,8 +235,6 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) {
|
||||||
b0 SPB2DT - Serial port break data : High-level */
|
b0 SPB2DT - Serial port break data : High-level */
|
||||||
obj->uart->SCSPTR = 0x0003u; // SPB2IO = 1, SPB2DT = 1
|
obj->uart->SCSPTR = 0x0003u; // SPB2IO = 1, SPB2DT = 1
|
||||||
|
|
||||||
obj->uart->SCSCR = 0x00F0;
|
|
||||||
|
|
||||||
/* ---- Line status register (SCLSR) setting ----
|
/* ---- Line status register (SCLSR) setting ----
|
||||||
b0 ORER - Overrun error detect : clear */
|
b0 ORER - Overrun error detect : clear */
|
||||||
|
|
||||||
|
|
@ -277,6 +275,10 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) {
|
||||||
uart_data[obj->index].sw_rts.pin = NC;
|
uart_data[obj->index].sw_rts.pin = NC;
|
||||||
uart_data[obj->index].sw_cts.pin = NC;
|
uart_data[obj->index].sw_cts.pin = NC;
|
||||||
|
|
||||||
|
/* ---- Serial control register (SCSCR) setting ---- */
|
||||||
|
/* Setting the TE and RE bits enables the TxD and RxD pins to be used. */
|
||||||
|
obj->uart->SCSCR = 0x00F0;
|
||||||
|
|
||||||
is_stdio_uart = (uart == STDIO_UART) ? (1) : (0);
|
is_stdio_uart = (uart == STDIO_UART) ? (1) : (0);
|
||||||
|
|
||||||
if (is_stdio_uart) {
|
if (is_stdio_uart) {
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ int us_ticker_inited = 0;
|
||||||
static double count_clock = 0;
|
static double count_clock = 0;
|
||||||
static uint32_t last_read = 0;
|
static uint32_t last_read = 0;
|
||||||
static uint32_t wrap_arround = 0;
|
static uint32_t wrap_arround = 0;
|
||||||
|
static uint64_t ticker_us_last64 = 0;
|
||||||
|
|
||||||
void us_ticker_interrupt(void) {
|
void us_ticker_interrupt(void) {
|
||||||
us_ticker_irq_handler();
|
us_ticker_irq_handler();
|
||||||
|
|
@ -61,69 +62,67 @@ void us_ticker_init(void) {
|
||||||
GIC_EnableIRQ(US_TICKER_TIMER_IRQn);
|
GIC_EnableIRQ(US_TICKER_TIMER_IRQn);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t us_ticker_read64() {
|
static uint64_t ticker_read_counter64(void) {
|
||||||
uint32_t val;
|
uint32_t cnt_val;
|
||||||
volatile uint64_t val64;
|
uint64_t cnt_val64;
|
||||||
int check_irq_masked;
|
|
||||||
|
|
||||||
check_irq_masked = __disable_irq();
|
|
||||||
|
|
||||||
if (!us_ticker_inited)
|
if (!us_ticker_inited)
|
||||||
us_ticker_init();
|
us_ticker_init();
|
||||||
|
|
||||||
/* read counter */
|
/* read counter */
|
||||||
val = OSTM1CNT;
|
cnt_val = OSTM1CNT;
|
||||||
if ( last_read > val ) {
|
if (last_read > cnt_val) {
|
||||||
wrap_arround++;
|
wrap_arround++;
|
||||||
}
|
}
|
||||||
last_read = val;
|
last_read = cnt_val;
|
||||||
val64 = ((uint64_t)wrap_arround << 32) + val;
|
cnt_val64 = ((uint64_t)wrap_arround << 32) + cnt_val;
|
||||||
|
|
||||||
/* clock to us */
|
return cnt_val64;
|
||||||
val64 = val64 / count_clock;
|
}
|
||||||
|
|
||||||
|
uint32_t us_ticker_read() {
|
||||||
|
uint64_t cnt_val64;
|
||||||
|
uint64_t us_val64;
|
||||||
|
int check_irq_masked;
|
||||||
|
|
||||||
|
check_irq_masked = __disable_irq();
|
||||||
|
|
||||||
|
cnt_val64 = ticker_read_counter64();
|
||||||
|
us_val64 = (cnt_val64 / count_clock);
|
||||||
|
ticker_us_last64 = us_val64;
|
||||||
|
|
||||||
if (!check_irq_masked) {
|
if (!check_irq_masked) {
|
||||||
__enable_irq();
|
__enable_irq();
|
||||||
}
|
}
|
||||||
|
|
||||||
return val64;
|
/* clock to us */
|
||||||
}
|
return (uint32_t)us_val64;
|
||||||
|
|
||||||
uint32_t us_ticker_read() {
|
|
||||||
return (uint32_t)us_ticker_read64();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void us_ticker_set_interrupt(timestamp_t timestamp) {
|
void us_ticker_set_interrupt(timestamp_t timestamp) {
|
||||||
// set match value
|
// set match value
|
||||||
volatile uint64_t set_cmp_val = 0;
|
uint64_t timestamp64;
|
||||||
uint64_t timestamp_tmp;
|
uint64_t set_cmp_val64;
|
||||||
int64_t timestamp_req;
|
volatile uint32_t set_cmp_val;
|
||||||
int64_t timestamp_comp;
|
uint64_t count_val_64;
|
||||||
uint64_t timestamp_now = us_ticker_read64();
|
|
||||||
|
|
||||||
/* calc compare mach timestamp */
|
/* calc compare mach timestamp */
|
||||||
set_cmp_val = (timestamp_now & 0xFFFFFFFF00000000) + timestamp;
|
timestamp64 = (ticker_us_last64 & 0xFFFFFFFF00000000) + timestamp;
|
||||||
|
if (timestamp < (ticker_us_last64 & 0x00000000FFFFFFFF)) {
|
||||||
timestamp_tmp = (uint64_t)timestamp;
|
/* This event is wrap arround */
|
||||||
timestamp_req = (int64_t)timestamp_tmp;
|
timestamp64 += 0x100000000;
|
||||||
|
|
||||||
timestamp_tmp = (uint64_t)(timestamp_now & 0x00000000FFFFFFFF);
|
|
||||||
timestamp_comp = (int64_t)timestamp_tmp;
|
|
||||||
|
|
||||||
if (timestamp_req <= timestamp_comp + 1) {
|
|
||||||
if (((timestamp_req - timestamp_comp) <= 1) && ((timestamp_req - timestamp_comp) >= -10)) {
|
|
||||||
/* This event was in the past */
|
|
||||||
us_ticker_irq_handler();
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
/* This event is wrap arround */
|
|
||||||
set_cmp_val += 0x100000000;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* calc compare mach timestamp */
|
/* calc compare mach timestamp */
|
||||||
set_cmp_val = set_cmp_val * count_clock;
|
set_cmp_val64 = timestamp64 * count_clock;
|
||||||
OSTM1CMP = (uint32_t)(set_cmp_val & 0xffffffff);
|
set_cmp_val = (uint32_t)(set_cmp_val64 & 0x00000000FFFFFFFF);
|
||||||
|
count_val_64 = ticker_read_counter64();
|
||||||
|
if (set_cmp_val64 <= (count_val_64 + 500)) {
|
||||||
|
GIC_SetPendingIRQ(US_TICKER_TIMER_IRQn);
|
||||||
|
GIC_EnableIRQ(US_TICKER_TIMER_IRQn);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
OSTM1CMP = set_cmp_val;
|
||||||
GIC_EnableIRQ(US_TICKER_TIMER_IRQn);
|
GIC_EnableIRQ(US_TICKER_TIMER_IRQn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -132,6 +131,5 @@ void us_ticker_disable_interrupt(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void us_ticker_clear_interrupt(void) {
|
void us_ticker_clear_interrupt(void) {
|
||||||
/* There are no Flags of OSTM1 to clear here */
|
GIC_ClearPendingIRQ(US_TICKER_TIMER_IRQn);
|
||||||
/* Do Nothing */
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,9 @@ typedef enum {
|
||||||
UART_3 = (int)USART3_BASE,
|
UART_3 = (int)USART3_BASE,
|
||||||
UART_4 = (int)UART4_BASE,
|
UART_4 = (int)UART4_BASE,
|
||||||
UART_5 = (int)UART5_BASE,
|
UART_5 = (int)UART5_BASE,
|
||||||
UART_6 = (int)USART6_BASE
|
UART_6 = (int)USART6_BASE,
|
||||||
|
UART_7 = (int)UART7_BASE,
|
||||||
|
UART_8 = (int)UART8_BASE
|
||||||
} UARTName;
|
} UARTName;
|
||||||
|
|
||||||
#define STDIO_UART_TX PD_8
|
#define STDIO_UART_TX PD_8
|
||||||
|
|
|
||||||
|
|
@ -133,12 +133,14 @@ const PinMap PinMap_PWM[] = {
|
||||||
const PinMap PinMap_UART_TX[] = {
|
const PinMap PinMap_UART_TX[] = {
|
||||||
{PA_9, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},
|
{PA_9, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},
|
||||||
{PD_8, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
{PD_8, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||||
|
{PF_7, UART_7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)},
|
||||||
{NC, NC, 0}
|
{NC, NC, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
const PinMap PinMap_UART_RX[] = {
|
const PinMap PinMap_UART_RX[] = {
|
||||||
{PA_10, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},
|
{PA_10, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},
|
||||||
{PD_9, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
{PD_9, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||||
|
{PF_6, UART_7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)},
|
||||||
{NC, NC, 0}
|
{NC, NC, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -37,9 +37,9 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "PeripheralPins.h"
|
#include "PeripheralPins.h"
|
||||||
|
|
||||||
#define UART_NUM (6)
|
#define UART_NUM (8)
|
||||||
|
|
||||||
static uint32_t serial_irq_ids[UART_NUM] = {0, 0, 0, 0, 0, 0};
|
static uint32_t serial_irq_ids[UART_NUM] = {0, 0, 0, 0, 0, 0, 0, 0};
|
||||||
|
|
||||||
static uart_irq_handler irq_handler;
|
static uart_irq_handler irq_handler;
|
||||||
|
|
||||||
|
|
@ -111,6 +111,18 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
|
||||||
__USART6_CLK_ENABLE();
|
__USART6_CLK_ENABLE();
|
||||||
obj->index = 5;
|
obj->index = 5;
|
||||||
break;
|
break;
|
||||||
|
#if defined(UART7_BASE)
|
||||||
|
case UART_7:
|
||||||
|
__UART7_CLK_ENABLE();
|
||||||
|
obj->index = 6;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if defined(UART8_BASE)
|
||||||
|
case UART_8:
|
||||||
|
__UART8_CLK_ENABLE();
|
||||||
|
obj->index = 7;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Configure the UART pins
|
// Configure the UART pins
|
||||||
|
|
@ -181,6 +193,20 @@ void serial_free(serial_t *obj)
|
||||||
__USART6_RELEASE_RESET();
|
__USART6_RELEASE_RESET();
|
||||||
__USART6_CLK_DISABLE();
|
__USART6_CLK_DISABLE();
|
||||||
break;
|
break;
|
||||||
|
#if defined(UART7_BASE)
|
||||||
|
case UART_7:
|
||||||
|
__UART7_FORCE_RESET();
|
||||||
|
__UART7_RELEASE_RESET();
|
||||||
|
__UART7_CLK_DISABLE();
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if defined(UART8_BASE)
|
||||||
|
case UART_8:
|
||||||
|
__UART8_FORCE_RESET();
|
||||||
|
__UART8_RELEASE_RESET();
|
||||||
|
__UART8_CLK_DISABLE();
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
// Configure GPIOs
|
// Configure GPIOs
|
||||||
pin_function(obj->pin_tx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
|
pin_function(obj->pin_tx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
|
||||||
|
|
@ -281,6 +307,20 @@ static void uart6_irq(void)
|
||||||
uart_irq(UART_6, 5);
|
uart_irq(UART_6, 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(UART7_BASE)
|
||||||
|
static void uart7_irq(void)
|
||||||
|
{
|
||||||
|
uart_irq(UART_7, 6);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(UART8_BASE)
|
||||||
|
static void uart8_irq(void)
|
||||||
|
{
|
||||||
|
uart_irq(UART_8, 7);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
|
void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
|
||||||
{
|
{
|
||||||
irq_handler = handler;
|
irq_handler = handler;
|
||||||
|
|
@ -326,6 +366,18 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
|
||||||
irq_n = USART6_IRQn;
|
irq_n = USART6_IRQn;
|
||||||
vector = (uint32_t)&uart6_irq;
|
vector = (uint32_t)&uart6_irq;
|
||||||
break;
|
break;
|
||||||
|
#if defined(UART7_BASE)
|
||||||
|
case UART_7:
|
||||||
|
irq_n = UART7_IRQn;
|
||||||
|
vector = (uint32_t)&uart7_irq;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if defined(UART8_BASE)
|
||||||
|
case UART_8:
|
||||||
|
irq_n = UART8_IRQn;
|
||||||
|
vector = (uint32_t)&uart8_irq;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (enable) {
|
if (enable) {
|
||||||
|
|
|
||||||
|
|
@ -258,40 +258,6 @@ void _main_init (void) {
|
||||||
#pragma pop
|
#pragma pop
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
#if 0
|
|
||||||
//#ifdef __MBED_CMSIS_RTOS_CA9
|
|
||||||
__asm void __rt_entry (void) {
|
|
||||||
|
|
||||||
IMPORT __user_setup_stackheap
|
|
||||||
IMPORT __rt_lib_init
|
|
||||||
IMPORT os_thread_def_main
|
|
||||||
IMPORT osKernelInitialize
|
|
||||||
IMPORT osKernelStart
|
|
||||||
IMPORT osThreadCreate
|
|
||||||
IMPORT InterruptHandlerRegister
|
|
||||||
IMPORT PendSV_Handler
|
|
||||||
IMPORT OS_Tick_Handler
|
|
||||||
IMPORT exit
|
|
||||||
|
|
||||||
BL __user_setup_stackheap
|
|
||||||
MOV R1,R2
|
|
||||||
BL __rt_lib_init
|
|
||||||
BL osKernelInitialize
|
|
||||||
LDR R0,=os_thread_def_main
|
|
||||||
MOVS R1,#0
|
|
||||||
BL osThreadCreate
|
|
||||||
BL osKernelStart
|
|
||||||
MOVS R0,#0
|
|
||||||
LDR R1,=PendSV_Handler
|
|
||||||
BL InterruptHandlerRegister
|
|
||||||
MOVS R0,#134
|
|
||||||
LDR R1,=OS_Tick_Handler
|
|
||||||
BL InterruptHandlerRegister
|
|
||||||
BL exit
|
|
||||||
|
|
||||||
ALIGN
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
__asm void __rt_entry (void) {
|
__asm void __rt_entry (void) {
|
||||||
|
|
||||||
IMPORT __user_setup_stackheap
|
IMPORT __user_setup_stackheap
|
||||||
|
|
@ -315,7 +281,6 @@ __asm void __rt_entry (void) {
|
||||||
ALIGN
|
ALIGN
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
#elif defined (__GNUC__)
|
#elif defined (__GNUC__)
|
||||||
|
|
||||||
|
|
@ -375,7 +340,7 @@ __attribute ((noreturn)) void __cs3_start_c (void){
|
||||||
__attribute__((naked)) void software_init_hook (void) {
|
__attribute__((naked)) void software_init_hook (void) {
|
||||||
__asm (
|
__asm (
|
||||||
".syntax unified\n"
|
".syntax unified\n"
|
||||||
".thumb\n"
|
".arm\n"
|
||||||
"movs r0,#0\n"
|
"movs r0,#0\n"
|
||||||
"movs r1,#0\n"
|
"movs r1,#0\n"
|
||||||
"mov r4,r0\n"
|
"mov r4,r0\n"
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,7 @@
|
||||||
// <i> Defines the number of threads with user-provided stack size.
|
// <i> Defines the number of threads with user-provided stack size.
|
||||||
// <i> Default: 0
|
// <i> Default: 0
|
||||||
#ifndef OS_PRIVCNT
|
#ifndef OS_PRIVCNT
|
||||||
#define OS_PRIVCNT 8
|
#define OS_PRIVCNT 10
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// <o>Total stack size [bytes] for threads with user-provided stack size <0-4096:8><#/4>
|
// <o>Total stack size [bytes] for threads with user-provided stack size <0-4096:8><#/4>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,474 @@
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* RL-ARM - RTX
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* Name: HAL_CA9.c
|
||||||
|
* Purpose: Hardware Abstraction Layer for Cortex-A9
|
||||||
|
* Rev.: 3 Sept 2013
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* Copyright (c) 2012 - 2013 ARM Limited
|
||||||
|
* All rights reserved.
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* - Neither the name of ARM nor the names of its contributors may be used
|
||||||
|
* to endorse or promote products derived from this software without
|
||||||
|
* specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
.global rt_set_PSP
|
||||||
|
.global rt_get_PSP
|
||||||
|
.global _alloc_box
|
||||||
|
.global _free_box
|
||||||
|
.global PendSV_Handler
|
||||||
|
.global OS_Tick_Handler
|
||||||
|
|
||||||
|
.EQU CPSR_T_BIT, 0x20
|
||||||
|
.EQU CPSR_I_BIT, 0x80
|
||||||
|
.EQU CPSR_F_BIT, 0x40
|
||||||
|
|
||||||
|
.EQU MODE_USR, 0x10
|
||||||
|
.EQU MODE_FIQ, 0x11
|
||||||
|
.EQU MODE_IRQ, 0x12
|
||||||
|
.EQU MODE_SVC, 0x13
|
||||||
|
.EQU MODE_ABT, 0x17
|
||||||
|
.EQU MODE_UND, 0x1B
|
||||||
|
.EQU MODE_SYS, 0x1F
|
||||||
|
|
||||||
|
.EQU TCB_TID, 3 /* 'task id' offset */
|
||||||
|
.EQU TCB_STACKF, 32 /* 'stack_frame' offset */
|
||||||
|
.EQU TCB_TSTACK, 36 /* 'tsk_stack' offset */
|
||||||
|
|
||||||
|
.extern rt_alloc_box
|
||||||
|
.extern os_tsk
|
||||||
|
.extern GICInterface_BASE
|
||||||
|
.extern rt_pop_req
|
||||||
|
.extern os_tick_irqack
|
||||||
|
.extern rt_systick
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* Functions
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
.text
|
||||||
|
@ For A-class, set USR/SYS stack
|
||||||
|
@ __asm void rt_set_PSP (U32 stack) {
|
||||||
|
rt_set_PSP:
|
||||||
|
.arm
|
||||||
|
|
||||||
|
MRS R1, CPSR
|
||||||
|
CPS #MODE_SYS @no effect in USR mode
|
||||||
|
ISB
|
||||||
|
MOV SP, R0
|
||||||
|
MSR CPSR_c, R1 @no effect in USR mode
|
||||||
|
ISB
|
||||||
|
BX LR
|
||||||
|
|
||||||
|
@ }
|
||||||
|
|
||||||
|
@ For A-class, get USR/SYS stack
|
||||||
|
@ __asm U32 rt_get_PSP (void) {
|
||||||
|
rt_get_PSP:
|
||||||
|
.arm
|
||||||
|
|
||||||
|
MRS R1, CPSR
|
||||||
|
CPS #MODE_SYS @no effect in USR mode
|
||||||
|
ISB
|
||||||
|
MOV R0, SP
|
||||||
|
MSR CPSR_c, R1 @no effect in USR mode
|
||||||
|
ISB
|
||||||
|
BX LR
|
||||||
|
|
||||||
|
@ }
|
||||||
|
|
||||||
|
/*--------------------------- _alloc_box ------------------------------------*/
|
||||||
|
@ __asm void *_alloc_box (void *box_mem) {
|
||||||
|
_alloc_box:
|
||||||
|
/* Function wrapper for Unprivileged/Privileged mode. */
|
||||||
|
.arm
|
||||||
|
|
||||||
|
LDR R12,=rt_alloc_box @ __cpp(rt_alloc_box)
|
||||||
|
MRS R2, CPSR
|
||||||
|
LSLS R2, #28
|
||||||
|
BXNE R12
|
||||||
|
SVC 0
|
||||||
|
BX LR
|
||||||
|
@ }
|
||||||
|
|
||||||
|
|
||||||
|
/*--------------------------- _free_box -------------------------------------*/
|
||||||
|
@ __asm int _free_box (void *box_mem, void *box) {
|
||||||
|
_free_box:
|
||||||
|
/* Function wrapper for Unprivileged/Privileged mode. */
|
||||||
|
.arm
|
||||||
|
|
||||||
|
LDR R12,=rt_free_box @ __cpp(rt_free_box)
|
||||||
|
MRS R2, CPSR
|
||||||
|
LSLS R2, #28
|
||||||
|
BXNE R12
|
||||||
|
SVC 0
|
||||||
|
BX LR
|
||||||
|
|
||||||
|
@ }
|
||||||
|
|
||||||
|
/*-------------------------- SVC_Handler -----------------------------------*/
|
||||||
|
|
||||||
|
@ #pragma push
|
||||||
|
@ #pragma arm
|
||||||
|
@ __asm void SVC_Handler (void) {
|
||||||
|
|
||||||
|
.type SVC_Handler, %function
|
||||||
|
.global SVC_Handler
|
||||||
|
SVC_Handler:
|
||||||
|
@ PRESERVE8
|
||||||
|
.arm
|
||||||
|
.extern rt_tsk_lock
|
||||||
|
.extern rt_tsk_unlock
|
||||||
|
.extern SVC_Count
|
||||||
|
.extern SVC_Table
|
||||||
|
.extern rt_stk_check
|
||||||
|
.extern FPUEnable
|
||||||
|
|
||||||
|
.EQU Mode_SVC, 0x13
|
||||||
|
|
||||||
|
SRSDB SP!, #Mode_SVC @ Push LR_SVC and SPRS_SVC onto SVC mode stack
|
||||||
|
PUSH {R4} @ Push R4 so we can use it as a temp
|
||||||
|
|
||||||
|
|
||||||
|
MRS R4,SPSR @ Get SPSR
|
||||||
|
TST R4,#CPSR_T_BIT @ Check Thumb Bit
|
||||||
|
LDRNEH R4,[LR,#-2] @ Thumb: Load Halfword
|
||||||
|
BICNE R4,R4,#0xFF00 @ Extract SVC Number
|
||||||
|
LDREQ R4,[LR,#-4] @ ARM: Load Word
|
||||||
|
BICEQ R4,R4,#0xFF000000 @ Extract SVC Number
|
||||||
|
|
||||||
|
/* Lock out systick and re-enable interrupts */
|
||||||
|
PUSH {R0-R3,R12,LR}
|
||||||
|
|
||||||
|
AND R12, SP, #4 @ Ensure stack is 8-byte aligned
|
||||||
|
SUB SP, SP, R12 @ Adjust stack
|
||||||
|
PUSH {R12, LR} @ Store stack adjustment and dummy LR to SVC stack
|
||||||
|
|
||||||
|
BLX rt_tsk_lock
|
||||||
|
CPSIE i
|
||||||
|
|
||||||
|
POP {R12, LR} @ Get stack adjustment & discard dummy LR
|
||||||
|
ADD SP, SP, R12 @ Unadjust stack
|
||||||
|
|
||||||
|
POP {R0-R3,R12,LR}
|
||||||
|
|
||||||
|
CMP R4,#0
|
||||||
|
BNE SVC_User
|
||||||
|
|
||||||
|
MRS R4,SPSR
|
||||||
|
PUSH {R4} @ Push R4 so we can use it as a temp
|
||||||
|
AND R4, SP, #4 @ Ensure stack is 8-byte aligned
|
||||||
|
SUB SP, SP, R4 @ Adjust stack
|
||||||
|
PUSH {R4, LR} @ Store stack adjustment and dummy LR
|
||||||
|
BLX R12
|
||||||
|
POP {R4, LR} @ Get stack adjustment & discard dummy LR
|
||||||
|
ADD SP, SP, R4 @ Unadjust stack
|
||||||
|
POP {R4} @ Restore R4
|
||||||
|
MSR SPSR_cxsf,R4
|
||||||
|
|
||||||
|
/* Here we will be in SVC mode (even if coming in from PendSV_Handler or OS_Tick_Handler) */
|
||||||
|
Sys_Switch:
|
||||||
|
LDR LR,=os_tsk @ __cpp(&os_tsk)
|
||||||
|
LDM LR,{R4,LR} @ os_tsk.run, os_tsk.new
|
||||||
|
CMP R4,LR
|
||||||
|
BNE switching
|
||||||
|
|
||||||
|
PUSH {R0-R3,R12,LR}
|
||||||
|
|
||||||
|
AND R12, SP, #4 @ Ensure stack is 8-byte aligned
|
||||||
|
SUB SP, SP, R12 @ Adjust stack
|
||||||
|
PUSH {R12, LR} @ Store stack adjustment and dummy LR to SVC stack
|
||||||
|
|
||||||
|
CPSID i
|
||||||
|
BLX rt_tsk_unlock
|
||||||
|
|
||||||
|
POP {R12, LR} @ Get stack adjustment & discard dummy LR
|
||||||
|
ADD SP, SP, R12 @ Unadjust stack
|
||||||
|
|
||||||
|
POP {R0-R3,R12,LR}
|
||||||
|
POP {R4}
|
||||||
|
RFEFD SP! @ Return from exception, no task switch
|
||||||
|
|
||||||
|
switching:
|
||||||
|
CLREX
|
||||||
|
CMP R4,#0
|
||||||
|
ADDEQ SP,SP,#12 @ Original R4, LR & SPSR do not need to be popped when we are paging in a different task
|
||||||
|
BEQ SVC_Next @ Runtask deleted?
|
||||||
|
|
||||||
|
|
||||||
|
PUSH {R8-R11} @ R4 and LR already stacked
|
||||||
|
MOV R10,R4 @ Preserve os_tsk.run
|
||||||
|
MOV R11,LR @ Preserve os_tsk.new
|
||||||
|
|
||||||
|
ADD R8,SP,#16 @ Unstack R4,LR
|
||||||
|
LDMIA R8,{R4,LR}
|
||||||
|
|
||||||
|
SUB SP,SP,#4 @ Make space on the stack for the next instn
|
||||||
|
STMIA SP,{SP}^ @ Put User SP onto stack
|
||||||
|
POP {R8} @ Pop User SP into R8
|
||||||
|
|
||||||
|
MRS R9,SPSR
|
||||||
|
STMDB R8!,{R9} @ User CPSR
|
||||||
|
STMDB R8!,{LR} @ User PC
|
||||||
|
STMDB R8,{LR}^ @ User LR
|
||||||
|
SUB R8,R8,#4 @ No writeback for store of User LR
|
||||||
|
STMDB R8!,{R0-R3,R12} @ User R0-R3,R12
|
||||||
|
MOV R3,R10 @ os_tsk.run
|
||||||
|
MOV LR,R11 @ os_tsk.new
|
||||||
|
POP {R9-R12}
|
||||||
|
ADD SP,SP,#12 @ Fix up SP for unstack of R4, LR & SPSR
|
||||||
|
STMDB R8!,{R4-R7,R9-R12} @ User R4-R11
|
||||||
|
|
||||||
|
@ If applicable, stack VFP state
|
||||||
|
MRC p15,0,R1,c1,c0,2 @ VFP/NEON access enabled? (CPACR)
|
||||||
|
AND R2,R1,#0x00F00000
|
||||||
|
CMP R2,#0x00F00000
|
||||||
|
BNE no_outgoing_vfp
|
||||||
|
VMRS R2,FPSCR
|
||||||
|
STMDB R8!,{R2,R4} @ Push FPSCR, maintain 8-byte alignment
|
||||||
|
VSTMDB R8!,{S0-S31}
|
||||||
|
LDRB R2,[R3,#TCB_STACKF] @ Record in TCB that VFP state is stacked
|
||||||
|
ORR R2,#2
|
||||||
|
STRB R2,[R3,#TCB_STACKF]
|
||||||
|
|
||||||
|
no_outgoing_vfp:
|
||||||
|
STR R8,[R3,#TCB_TSTACK]
|
||||||
|
MOV R4,LR
|
||||||
|
|
||||||
|
PUSH {R4} @ Push R4 so we can use it as a temp
|
||||||
|
AND R4, SP, #4 @ Ensure stack is 8-byte aligned
|
||||||
|
SUB SP, SP, R4 @ Adjust stack
|
||||||
|
PUSH {R4, LR} @ Store stack adjustment and dummy LR to SVC stack
|
||||||
|
|
||||||
|
BLX rt_stk_check
|
||||||
|
|
||||||
|
POP {R4, LR} @ Get stack adjustment & discard dummy LR
|
||||||
|
ADD SP, SP, R4 @ Unadjust stack
|
||||||
|
POP {R4} @ Restore R4
|
||||||
|
|
||||||
|
MOV LR,R4
|
||||||
|
|
||||||
|
SVC_Next: @ R4 == os_tsk.run, LR == os_tsk.new, R0-R3, R5-R12 corruptible
|
||||||
|
LDR R1,=os_tsk @ __cpp(&os_tsk), os_tsk.run = os_tsk.new
|
||||||
|
STR LR,[R1]
|
||||||
|
LDRB R1,[LR,#TCB_TID] @ os_tsk.run->task_id
|
||||||
|
LSL R1,#8 @ Store PROCID
|
||||||
|
MCR p15,0,R1,c13,c0,1 @ Write CONTEXTIDR
|
||||||
|
|
||||||
|
LDR R0,[LR,#TCB_TSTACK] @ os_tsk.run->tsk_stack
|
||||||
|
|
||||||
|
@ Does incoming task have VFP state in stack?
|
||||||
|
LDRB R3,[LR,#TCB_STACKF]
|
||||||
|
TST R3,#0x2
|
||||||
|
MRC p15,0,R1,c1,c0,2 @ Read CPACR
|
||||||
|
ANDEQ R1,R1,#0xFF0FFFFF @ Disable VFP access if incoming task does not have stacked VFP state
|
||||||
|
ORRNE R1,R1,#0x00F00000 @ Enable VFP access if incoming task does have stacked VFP state
|
||||||
|
MCR p15,0,R1,c1,c0,2 @ Write CPACR
|
||||||
|
BEQ no_incoming_vfp
|
||||||
|
ISB @ We only need the sync if we enabled, otherwise we will context switch before next VFP instruction anyway
|
||||||
|
VLDMIA R0!,{S0-S31}
|
||||||
|
LDR R2,[R0]
|
||||||
|
VMSR FPSCR,R2
|
||||||
|
ADD R0,R0,#8
|
||||||
|
|
||||||
|
no_incoming_vfp:
|
||||||
|
LDR R1,[R0,#60] @ Restore User CPSR
|
||||||
|
MSR SPSR_cxsf,R1
|
||||||
|
LDMIA R0!,{R4-R11} @ Restore User R4-R11
|
||||||
|
ADD R0,R0,#4 @ Restore User R1-R3,R12
|
||||||
|
LDMIA R0!,{R1-R3,R12}
|
||||||
|
LDMIA R0,{LR}^ @ Restore User LR
|
||||||
|
ADD R0,R0,#4 @ No writeback for load to user LR
|
||||||
|
LDMIA R0!,{LR} @ Restore User PC
|
||||||
|
ADD R0,R0,#4 @ Correct User SP for unstacked user CPSR
|
||||||
|
|
||||||
|
PUSH {R0} @ Push R0 onto stack
|
||||||
|
LDMIA SP,{SP}^ @ Get R0 off stack into User SP
|
||||||
|
ADD SP,SP,#4 @ Put SP back
|
||||||
|
|
||||||
|
LDR R0,[R0,#-32] @ Restore R0
|
||||||
|
|
||||||
|
PUSH {R0-R3,R12,LR}
|
||||||
|
|
||||||
|
AND R12, SP, #4 @ Ensure stack is 8-byte aligned
|
||||||
|
SUB SP, SP, R12 @ Adjust stack
|
||||||
|
PUSH {R12, LR} @ Store stack adjustment and dummy LR to SVC stack
|
||||||
|
|
||||||
|
CPSID i
|
||||||
|
BLX rt_tsk_unlock
|
||||||
|
|
||||||
|
POP {R12, LR} @ Get stack adjustment & discard dummy LR
|
||||||
|
ADD SP, SP, R12 @ Unadjust stack
|
||||||
|
|
||||||
|
POP {R0-R3,R12,LR}
|
||||||
|
|
||||||
|
MOVS PC,LR @ Return from exception
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------- User SVC -------------------------------*/
|
||||||
|
|
||||||
|
SVC_User:
|
||||||
|
LDR R12,=SVC_Count
|
||||||
|
LDR R12,[R12]
|
||||||
|
CMP R4,R12 @ Check for overflow
|
||||||
|
BHI SVC_Done
|
||||||
|
|
||||||
|
LDR R12,=SVC_Table-4
|
||||||
|
LDR R12,[R12,R4,LSL #2] @ Load SVC Function Address
|
||||||
|
MRS R4,SPSR @ Save SPSR
|
||||||
|
PUSH {R4} @ Push R4 so we can use it as a temp
|
||||||
|
AND R4, SP, #4 @ Ensure stack is 8-byte aligned
|
||||||
|
SUB SP, SP, R4 @ Adjust stack
|
||||||
|
PUSH {R4, LR} @ Store stack adjustment and dummy LR
|
||||||
|
BLX R12 @ Call SVC Function
|
||||||
|
POP {R4, LR} @ Get stack adjustment & discard dummy LR
|
||||||
|
ADD SP, SP, R4 @ Unadjust stack
|
||||||
|
POP {R4} @ Restore R4
|
||||||
|
MSR SPSR_cxsf,R4 @ Restore SPSR
|
||||||
|
|
||||||
|
SVC_Done:
|
||||||
|
PUSH {R0-R3,R12,LR}
|
||||||
|
|
||||||
|
PUSH {R4} @ Push R4 so we can use it as a temp
|
||||||
|
AND R4, SP, #4 @ Ensure stack is 8-byte aligned
|
||||||
|
SUB SP, SP, R4 @ Adjust stack
|
||||||
|
PUSH {R4, LR} @ Store stack adjustment and dummy LR
|
||||||
|
|
||||||
|
CPSID i
|
||||||
|
BLX rt_tsk_unlock
|
||||||
|
|
||||||
|
POP {R4, LR} @ Get stack adjustment & discard dummy LR
|
||||||
|
ADD SP, SP, R4 @ Unadjust stack
|
||||||
|
POP {R4} @ Restore R4
|
||||||
|
|
||||||
|
POP {R0-R3,R12,LR}
|
||||||
|
POP {R4}
|
||||||
|
RFEFD SP! @ Return from exception
|
||||||
|
|
||||||
|
@ }
|
||||||
|
|
||||||
|
@ #pragma pop
|
||||||
|
|
||||||
|
|
||||||
|
@ #pragma push
|
||||||
|
@ #pragma arm
|
||||||
|
@ __asm void PendSV_Handler (U32 IRQn) {
|
||||||
|
PendSV_Handler:
|
||||||
|
.arm
|
||||||
|
|
||||||
|
.extern rt_tsk_lock
|
||||||
|
.extern IRQNestLevel
|
||||||
|
|
||||||
|
ADD SP,SP,#8 @ fix up stack pointer (R0 has been pushed and will never be popped, R1 was pushed for stack alignment)
|
||||||
|
|
||||||
|
@ Disable systick interrupts, then write EOIR. We want interrupts disabled before we enter the context switcher.
|
||||||
|
PUSH {R0, R1}
|
||||||
|
BLX rt_tsk_lock
|
||||||
|
POP {R0, R1}
|
||||||
|
LDR R1, =GICInterface_BASE @ __cpp(&GICInterface_BASE)
|
||||||
|
LDR R1, [R1, #0]
|
||||||
|
STR R0, [R1, #0x10]
|
||||||
|
|
||||||
|
LDR R0, =IRQNestLevel @ Get address of nesting counter
|
||||||
|
LDR R1, [R0]
|
||||||
|
SUB R1, R1, #1 @ Decrement nesting counter
|
||||||
|
STR R1, [R0]
|
||||||
|
|
||||||
|
BLX rt_pop_req @ __cpp(rt_pop_req)
|
||||||
|
|
||||||
|
POP {R1, LR} @ Get stack adjustment & discard dummy LR
|
||||||
|
ADD SP, SP, R1 @ Unadjust stack
|
||||||
|
|
||||||
|
LDR R0,[SP,#24]
|
||||||
|
MSR SPSR_cxsf,R0
|
||||||
|
POP {R0-R3,R12} @ Leave SPSR & LR on the stack
|
||||||
|
PUSH {R4}
|
||||||
|
B Sys_Switch
|
||||||
|
@ }
|
||||||
|
@ #pragma pop
|
||||||
|
|
||||||
|
@ #pragma push
|
||||||
|
@ #pragma arm
|
||||||
|
@ __asm void OS_Tick_Handler (U32 IRQn) {
|
||||||
|
OS_Tick_Handler:
|
||||||
|
.arm
|
||||||
|
|
||||||
|
ADD SP,SP,#8 @ fix up stack pointer (R0 has been pushed and will never be popped, R1 was pushed for stack alignment)
|
||||||
|
|
||||||
|
PUSH {R0, R1}
|
||||||
|
BLX rt_tsk_lock
|
||||||
|
POP {R0, R1}
|
||||||
|
LDR R1, =GICInterface_BASE @ __cpp(&GICInterface_BASE)
|
||||||
|
LDR R1, [R1, #0]
|
||||||
|
STR R0, [R1, #0x10]
|
||||||
|
|
||||||
|
LDR R0, =IRQNestLevel @ Get address of nesting counter
|
||||||
|
LDR R1, [R0]
|
||||||
|
SUB R1, R1, #1 @ Decrement nesting counter
|
||||||
|
STR R1, [R0]
|
||||||
|
|
||||||
|
BLX os_tick_irqack @ __cpp(os_tick_irqack)
|
||||||
|
BLX rt_systick @ __cpp(rt_systick)
|
||||||
|
|
||||||
|
POP {R1, LR} @ Get stack adjustment & discard dummy LR
|
||||||
|
ADD SP, SP, R1 @ Unadjust stack
|
||||||
|
|
||||||
|
LDR R0,[SP,#24]
|
||||||
|
MSR SPSR_cxsf,R0
|
||||||
|
POP {R0-R3,R12} @ Leave SPSR & LR on the stack
|
||||||
|
PUSH {R4}
|
||||||
|
B Sys_Switch
|
||||||
|
@ }
|
||||||
|
@ #pragma pop
|
||||||
|
|
||||||
|
.global __set_PSP
|
||||||
|
@ __STATIC_ASM void __set_PSP(uint32_t topOfProcStack)
|
||||||
|
@ {
|
||||||
|
__set_PSP:
|
||||||
|
@ PRESERVE8
|
||||||
|
.arm
|
||||||
|
|
||||||
|
BIC R0, R0, #7 @ensure stack is 8-byte aligned
|
||||||
|
MRS R1, CPSR
|
||||||
|
CPS #MODE_SYS @no effect in USR mode
|
||||||
|
MOV SP, R0
|
||||||
|
MSR CPSR_c, R1 @no effect in USR mode
|
||||||
|
ISB
|
||||||
|
BX LR
|
||||||
|
|
||||||
|
@ }
|
||||||
|
|
||||||
|
.global __set_CPS_USR
|
||||||
|
@ __STATIC_ASM void __set_CPS_USR(void)
|
||||||
|
@ {
|
||||||
|
__set_CPS_USR:
|
||||||
|
.arm
|
||||||
|
|
||||||
|
CPS #MODE_USR
|
||||||
|
BX LR
|
||||||
|
@ }
|
||||||
|
|
||||||
|
.END
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* end of file
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* RL-ARM - RTX
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* Name: SVC_TABLE.S
|
||||||
|
* Purpose: Pre-defined SVC Table for Cortex-M
|
||||||
|
* Rev.: V4.70
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* Copyright (c) 1999-2009 KEIL, 2009-2013 ARM Germany GmbH
|
||||||
|
* All rights reserved.
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* - Neither the name of ARM nor the names of its contributors may be used
|
||||||
|
* to endorse or promote products derived from this software without
|
||||||
|
* specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
.section SVC_TABLE @, CODE, READONLY
|
||||||
|
.align 5
|
||||||
|
|
||||||
|
.global SVC_Count
|
||||||
|
|
||||||
|
.EQU SVC_Cnt, (SVC_End-SVC_Table)/4
|
||||||
|
|
||||||
|
SVC_Count:
|
||||||
|
.word SVC_Cnt
|
||||||
|
|
||||||
|
@ Import user SVC functions here.
|
||||||
|
@ .extern __SVC_1
|
||||||
|
.global SVC_Table
|
||||||
|
SVC_Table:
|
||||||
|
@ Insert user SVC functions here. SVC 0 used by RTL Kernel.
|
||||||
|
@ .word __SVC_1 @ InitMemorySubsystem
|
||||||
|
|
||||||
|
@SVC_End
|
||||||
|
SVC_End:
|
||||||
|
|
||||||
|
.END
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* end of file
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
@ -145,11 +145,63 @@ typedef uint32_t __attribute__((vector_size(16))) ret128;
|
||||||
|
|
||||||
#define RET_pointer __r0
|
#define RET_pointer __r0
|
||||||
#define RET_int32_t __r0
|
#define RET_int32_t __r0
|
||||||
|
#define RET_uint32_t __r0
|
||||||
#define RET_osStatus __r0
|
#define RET_osStatus __r0
|
||||||
#define RET_osPriority __r0
|
#define RET_osPriority __r0
|
||||||
#define RET_osEvent {(osStatus)__r0, {(uint32_t)__r1}, {(void *)__r2}}
|
#define RET_osEvent {(osStatus)__r0, {(uint32_t)__r1}, {(void *)__r2}}
|
||||||
#define RET_osCallback {(void *)__r0, (void *)__r1}
|
#define RET_osCallback {(void *)__r0, (void *)__r1}
|
||||||
|
|
||||||
|
#if defined (__ARM_PCS_VFP)
|
||||||
|
|
||||||
|
#define osEvent_type void
|
||||||
|
#define osEvent_ret_status { __asm ("MOV r0, %0;" \
|
||||||
|
: /* no outputs */ \
|
||||||
|
: "r"(ret.status) \
|
||||||
|
: "r0" \
|
||||||
|
); \
|
||||||
|
}
|
||||||
|
#define osEvent_ret_value { __asm ("MOV r1, %0;" \
|
||||||
|
"MOV r0, %1;" \
|
||||||
|
: /* no outputs */ \
|
||||||
|
: "r"(ret.value.v), \
|
||||||
|
"r"(ret.status) \
|
||||||
|
: "r0", "r1" \
|
||||||
|
); \
|
||||||
|
}
|
||||||
|
#define osEvent_ret_msg { __asm ("MOV r2, %0;" \
|
||||||
|
"MOV r1, %1;" \
|
||||||
|
"MOV r0, %2;" \
|
||||||
|
: /* no outputs */ \
|
||||||
|
: "r"(ret.def.message_id), \
|
||||||
|
"r"(ret.value.v), \
|
||||||
|
"r"(ret.status) \
|
||||||
|
: "r0", "r1" , "r2" \
|
||||||
|
); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define osEvent_ret_mail { __asm ("MOV r2, %0;" \
|
||||||
|
"MOV r1, %1;" \
|
||||||
|
"MOV r0, %2;" \
|
||||||
|
: /* no outputs */ \
|
||||||
|
: "r"(ret.def.mail_id), \
|
||||||
|
"r"(ret.value.v), \
|
||||||
|
"r"(ret.status) \
|
||||||
|
: "r0", "r1" , "r2" \
|
||||||
|
); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define osCallback_type void
|
||||||
|
#define osCallback_ret { __asm ("MOV r1, %0;" \
|
||||||
|
"MOV r0, %1;" \
|
||||||
|
: /* no outputs */ \
|
||||||
|
: "r"(ret.arg), \
|
||||||
|
"r"(ret.fp) \
|
||||||
|
: "r0", "r1" \
|
||||||
|
); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* defined (__ARM_PCS_VFP) */
|
||||||
|
|
||||||
#define osEvent_type ret128
|
#define osEvent_type ret128
|
||||||
#define osEvent_ret_status (ret128){ret.status}
|
#define osEvent_ret_status (ret128){ret.status}
|
||||||
#define osEvent_ret_value (ret128){ret.status, ret.value.v}
|
#define osEvent_ret_value (ret128){ret.status, ret.value.v}
|
||||||
|
|
@ -159,6 +211,8 @@ typedef uint32_t __attribute__((vector_size(16))) ret128;
|
||||||
#define osCallback_type ret64
|
#define osCallback_type ret64
|
||||||
#define osCallback_ret (ret64) {(uint32_t)ret.fp, (uint32_t)ret.arg}
|
#define osCallback_ret (ret64) {(uint32_t)ret.fp, (uint32_t)ret.arg}
|
||||||
|
|
||||||
|
#endif /* defined (__ARM_PCS_VFP) */
|
||||||
|
|
||||||
#define SVC_ArgN(n) \
|
#define SVC_ArgN(n) \
|
||||||
register int __r##n __asm("r"#n);
|
register int __r##n __asm("r"#n);
|
||||||
|
|
||||||
|
|
@ -808,14 +862,24 @@ os_InRegs osEvent_type svcWait (uint32_t millisec) {
|
||||||
|
|
||||||
if (millisec == 0) {
|
if (millisec == 0) {
|
||||||
ret.status = osOK;
|
ret.status = osOK;
|
||||||
|
#if defined (__GNUC__) && defined (__ARM_PCS_VFP)
|
||||||
|
osEvent_ret_status;
|
||||||
|
return;
|
||||||
|
#else
|
||||||
return osEvent_ret_status;
|
return osEvent_ret_status;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* To Do: osEventSignal, osEventMessage, osEventMail */
|
/* To Do: osEventSignal, osEventMessage, osEventMail */
|
||||||
rt_dly_wait(rt_ms2tick(millisec));
|
rt_dly_wait(rt_ms2tick(millisec));
|
||||||
ret.status = osEventTimeout;
|
ret.status = osEventTimeout;
|
||||||
|
|
||||||
|
#if defined (__GNUC__) && defined (__ARM_PCS_VFP)
|
||||||
|
osEvent_ret_status;
|
||||||
|
return;
|
||||||
|
#else
|
||||||
return osEvent_ret_status;
|
return osEvent_ret_status;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -1046,13 +1110,23 @@ os_InRegs osCallback_type svcTimerCall (osTimerId timer_id) {
|
||||||
if (pt == NULL) {
|
if (pt == NULL) {
|
||||||
ret.fp = NULL;
|
ret.fp = NULL;
|
||||||
ret.arg = NULL;
|
ret.arg = NULL;
|
||||||
|
#if defined (__GNUC__) && defined (__ARM_PCS_VFP)
|
||||||
|
osCallback_ret;
|
||||||
|
return;
|
||||||
|
#else
|
||||||
return osCallback_ret;
|
return osCallback_ret;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
ret.fp = (void *)pt->timer->ptimer;
|
ret.fp = (void *)pt->timer->ptimer;
|
||||||
ret.arg = pt->arg;
|
ret.arg = pt->arg;
|
||||||
|
|
||||||
|
#if defined (__GNUC__) && defined (__ARM_PCS_VFP)
|
||||||
|
osCallback_ret;
|
||||||
|
return;
|
||||||
|
#else
|
||||||
return osCallback_ret;
|
return osCallback_ret;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static __INLINE osStatus isrMessagePut (osMessageQId queue_id, uint32_t info, uint32_t millisec);
|
static __INLINE osStatus isrMessagePut (osMessageQId queue_id, uint32_t info, uint32_t millisec);
|
||||||
|
|
@ -1195,7 +1269,12 @@ os_InRegs osEvent_type svcSignalWait (int32_t signals, uint32_t millisec) {
|
||||||
|
|
||||||
if (signals & (0xFFFFFFFF << osFeature_Signals)) {
|
if (signals & (0xFFFFFFFF << osFeature_Signals)) {
|
||||||
ret.status = osErrorValue;
|
ret.status = osErrorValue;
|
||||||
|
#if defined (__GNUC__) && defined (__ARM_PCS_VFP)
|
||||||
|
osEvent_ret_status;
|
||||||
|
return;
|
||||||
|
#else
|
||||||
return osEvent_ret_status;
|
return osEvent_ret_status;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (signals != 0) { // Wait for all specified signals
|
if (signals != 0) { // Wait for all specified signals
|
||||||
|
|
@ -1212,7 +1291,12 @@ os_InRegs osEvent_type svcSignalWait (int32_t signals, uint32_t millisec) {
|
||||||
ret.value.signals = 0;
|
ret.value.signals = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined (__GNUC__) && defined (__ARM_PCS_VFP)
|
||||||
|
osEvent_ret_value;
|
||||||
|
return;
|
||||||
|
#else
|
||||||
return osEvent_ret_value;
|
return osEvent_ret_value;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1694,24 +1778,44 @@ os_InRegs osEvent_type svcMessageGet (osMessageQId queue_id, uint32_t millisec)
|
||||||
|
|
||||||
if (queue_id == NULL) {
|
if (queue_id == NULL) {
|
||||||
ret.status = osErrorParameter;
|
ret.status = osErrorParameter;
|
||||||
|
#if defined (__GNUC__) && defined (__ARM_PCS_VFP)
|
||||||
|
osEvent_ret_status;
|
||||||
|
return;
|
||||||
|
#else
|
||||||
return osEvent_ret_status;
|
return osEvent_ret_status;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((P_MCB)queue_id)->cb_type != MCB) {
|
if (((P_MCB)queue_id)->cb_type != MCB) {
|
||||||
ret.status = osErrorParameter;
|
ret.status = osErrorParameter;
|
||||||
|
#if defined (__GNUC__) && defined (__ARM_PCS_VFP)
|
||||||
|
osEvent_ret_status;
|
||||||
|
return;
|
||||||
|
#else
|
||||||
return osEvent_ret_status;
|
return osEvent_ret_status;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
res = rt_mbx_wait(queue_id, &ret.value.p, rt_ms2tick(millisec));
|
res = rt_mbx_wait(queue_id, &ret.value.p, rt_ms2tick(millisec));
|
||||||
|
|
||||||
if (res == OS_R_TMO) {
|
if (res == OS_R_TMO) {
|
||||||
ret.status = millisec ? osEventTimeout : osOK;
|
ret.status = millisec ? osEventTimeout : osOK;
|
||||||
|
#if defined (__GNUC__) && defined (__ARM_PCS_VFP)
|
||||||
|
osEvent_ret_value;
|
||||||
|
return;
|
||||||
|
#else
|
||||||
return osEvent_ret_value;
|
return osEvent_ret_value;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
ret.status = osEventMessage;
|
ret.status = osEventMessage;
|
||||||
|
|
||||||
|
#if defined (__GNUC__) && defined (__ARM_PCS_VFP)
|
||||||
|
osEvent_ret_value;
|
||||||
|
return;
|
||||||
|
#else
|
||||||
return osEvent_ret_value;
|
return osEvent_ret_value;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,7 @@
|
||||||
|
|
||||||
#if defined (__CC_ARM) /* ARM Compiler */
|
#if defined (__CC_ARM) /* ARM Compiler */
|
||||||
|
|
||||||
#if ((__TARGET_ARCH_7_M || __TARGET_ARCH_7E_M || __TARGET_ARCH_7_A) && !NO_EXCLUSIVE_ACCESS)
|
#if ((__TARGET_ARCH_7_M || __TARGET_ARCH_7E_M || __TARGET_ARCH_7_A) && !defined(NO_EXCLUSIVE_ACCESS))
|
||||||
#define __USE_EXCLUSIVE_ACCESS
|
#define __USE_EXCLUSIVE_ACCESS
|
||||||
#else
|
#else
|
||||||
#undef __USE_EXCLUSIVE_ACCESS
|
#undef __USE_EXCLUSIVE_ACCESS
|
||||||
|
|
@ -62,7 +62,16 @@
|
||||||
|
|
||||||
#elif defined (__GNUC__) /* GNU Compiler */
|
#elif defined (__GNUC__) /* GNU Compiler */
|
||||||
|
|
||||||
#error GNU Compiler support not implemented for Cortex-A
|
#undef __USE_EXCLUSIVE_ACCESS
|
||||||
|
|
||||||
|
#if defined (__VFP_FP__) && !defined(__SOFTFP__)
|
||||||
|
#define __TARGET_FPU_VFP 1
|
||||||
|
#else
|
||||||
|
#define __TARGET_FPU_VFP 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define __inline inline
|
||||||
|
#define __weak __attribute__((weak))
|
||||||
|
|
||||||
#elif defined (__ICCARM__) /* IAR Compiler */
|
#elif defined (__ICCARM__) /* IAR Compiler */
|
||||||
|
|
||||||
|
|
@ -94,7 +103,6 @@ extern const U32 GICInterface_BASE;
|
||||||
priority = GICI_ICCPMR; \
|
priority = GICI_ICCPMR; \
|
||||||
GICI_ICCPMR = 0xff; \
|
GICI_ICCPMR = 0xff; \
|
||||||
GICI_ICCPMR = GICI_ICCPMR - 1; \
|
GICI_ICCPMR = GICI_ICCPMR - 1; \
|
||||||
while(GICI_ICCPMR > priority);\
|
|
||||||
__DSB();\
|
__DSB();\
|
||||||
if(!irq_dis) __enable_irq(); \
|
if(!irq_dis) __enable_irq(); \
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,7 @@ OFFICIAL_MBED_LIBRARY_BUILD = (
|
||||||
('LPC11U68', ('ARM', 'uARM','GCC_ARM','GCC_CR', 'IAR')),
|
('LPC11U68', ('ARM', 'uARM','GCC_ARM','GCC_CR', 'IAR')),
|
||||||
('OC_MBUINO', ('ARM', 'uARM', 'GCC_ARM', 'IAR')),
|
('OC_MBUINO', ('ARM', 'uARM', 'GCC_ARM', 'IAR')),
|
||||||
|
|
||||||
('RZ_A1H' , ('ARM',)),
|
('RZ_A1H' , ('ARM', 'GCC_ARM')),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ OBJDUMP = $(GCC_BIN)arm-none-eabi-objdump
|
||||||
SIZE = $(GCC_BIN)arm-none-eabi-size
|
SIZE = $(GCC_BIN)arm-none-eabi-size
|
||||||
|
|
||||||
CPU = -mcpu=cortex-m3 -mthumb
|
CPU = -mcpu=cortex-m3 -mthumb
|
||||||
CC_FLAGS = $(CPU) -c -g -fno-common -fmessage-length=0 -Wall -fno-exceptions -ffunction-sections -fdata-sections -fno-rtti
|
CC_FLAGS = $(CPU) -c -g -fno-common -fmessage-length=0 -Wall -fno-exceptions -ffunction-sections -fdata-sections -fomit-frame-pointer
|
||||||
CC_FLAGS += -MMD -MP
|
CC_FLAGS += -MMD -MP
|
||||||
CC_SYMBOLS = {% for s in symbols %}-D{{s}} {% endfor %}
|
CC_SYMBOLS = {% for s in symbols %}-D{{s}} {% endfor %}
|
||||||
|
|
||||||
|
|
@ -34,7 +34,7 @@ else
|
||||||
CC_FLAGS += -DNDEBUG -Os
|
CC_FLAGS += -DNDEBUG -Os
|
||||||
endif
|
endif
|
||||||
|
|
||||||
all: $(PROJECT).bin $(PROJECT).hex size
|
all: $(PROJECT).bin $(PROJECT).hex
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f $(PROJECT).bin $(PROJECT).elf $(PROJECT).hex $(PROJECT).map $(PROJECT).lst $(OBJECTS) $(DEPS)
|
rm -f $(PROJECT).bin $(PROJECT).elf $(PROJECT).hex $(PROJECT).map $(PROJECT).lst $(OBJECTS) $(DEPS)
|
||||||
|
|
@ -46,11 +46,12 @@ clean:
|
||||||
$(CC) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu99 $(INCLUDE_PATHS) -o $@ $<
|
$(CC) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu99 $(INCLUDE_PATHS) -o $@ $<
|
||||||
|
|
||||||
.cpp.o:
|
.cpp.o:
|
||||||
$(CPP) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu++98 $(INCLUDE_PATHS) -o $@ $<
|
$(CPP) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu++98 -fno-rtti $(INCLUDE_PATHS) -o $@ $<
|
||||||
|
|
||||||
|
|
||||||
$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS)
|
$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS)
|
||||||
$(LD) $(LD_FLAGS) -T$(LINKER_SCRIPT) $(LIBRARY_PATHS) -o $@ $^ $(LIBRARIES) $(LD_SYS_LIBS) $(LIBRARIES) $(LD_SYS_LIBS)
|
$(LD) $(LD_FLAGS) -T$(LINKER_SCRIPT) $(LIBRARY_PATHS) -o $@ $^ $(LIBRARIES) $(LD_SYS_LIBS) $(LIBRARIES) $(LD_SYS_LIBS)
|
||||||
|
$(SIZE) $@
|
||||||
|
|
||||||
$(PROJECT).bin: $(PROJECT).elf
|
$(PROJECT).bin: $(PROJECT).elf
|
||||||
@$(OBJCOPY) -O binary $< $@
|
@$(OBJCOPY) -O binary $< $@
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ OBJDUMP = $(GCC_BIN)arm-none-eabi-objdump
|
||||||
SIZE = $(GCC_BIN)arm-none-eabi-size
|
SIZE = $(GCC_BIN)arm-none-eabi-size
|
||||||
|
|
||||||
CPU = -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=$(FLOAT_ABI)
|
CPU = -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=$(FLOAT_ABI)
|
||||||
CC_FLAGS = $(CPU) -c -g -fno-common -fmessage-length=0 -Wall -fno-exceptions -ffunction-sections -fdata-sections -fno-rtti
|
CC_FLAGS = $(CPU) -c -g -fno-common -fmessage-length=0 -Wall -fno-exceptions -ffunction-sections -fdata-sections -fomit-frame-pointer
|
||||||
CC_FLAGS += -MMD -MP
|
CC_FLAGS += -MMD -MP
|
||||||
CC_SYMBOLS = {% for s in symbols %}-D{{s}} {% endfor %}
|
CC_SYMBOLS = {% for s in symbols %}-D{{s}} {% endfor %}
|
||||||
|
|
||||||
|
|
@ -40,7 +40,7 @@ else
|
||||||
CC_FLAGS += -DNDEBUG -Os
|
CC_FLAGS += -DNDEBUG -Os
|
||||||
endif
|
endif
|
||||||
|
|
||||||
all: $(PROJECT).bin $(PROJECT).hex size
|
all: $(PROJECT).bin $(PROJECT).hex
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f $(PROJECT).bin $(PROJECT).elf $(PROJECT).hex $(PROJECT).map $(PROJECT).lst $(OBJECTS) $(DEPS)
|
rm -f $(PROJECT).bin $(PROJECT).elf $(PROJECT).hex $(PROJECT).map $(PROJECT).lst $(OBJECTS) $(DEPS)
|
||||||
|
|
@ -52,11 +52,12 @@ clean:
|
||||||
$(CC) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu99 $(INCLUDE_PATHS) -o $@ $<
|
$(CC) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu99 $(INCLUDE_PATHS) -o $@ $<
|
||||||
|
|
||||||
.cpp.o:
|
.cpp.o:
|
||||||
$(CPP) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu++98 $(INCLUDE_PATHS) -o $@ $<
|
$(CPP) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu++98 -fno-rtti $(INCLUDE_PATHS) -o $@ $<
|
||||||
|
|
||||||
|
|
||||||
$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS)
|
$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS)
|
||||||
$(LD) $(LD_FLAGS) -T$(LINKER_SCRIPT) $(LIBRARY_PATHS) -o $@ $^ $(LIBRARIES) $(LD_SYS_LIBS) $(LIBRARIES) $(LD_SYS_LIBS)
|
$(LD) $(LD_FLAGS) -T$(LINKER_SCRIPT) $(LIBRARY_PATHS) -o $@ $^ $(LIBRARIES) $(LD_SYS_LIBS) $(LIBRARIES) $(LD_SYS_LIBS)
|
||||||
|
$(SIZE) $@
|
||||||
|
|
||||||
$(PROJECT).bin: $(PROJECT).elf
|
$(PROJECT).bin: $(PROJECT).elf
|
||||||
@$(OBJCOPY) -O binary $< $@
|
@$(OBJCOPY) -O binary $< $@
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ OBJDUMP = $(GCC_BIN)arm-none-eabi-objdump
|
||||||
SIZE = $(GCC_BIN)arm-none-eabi-size
|
SIZE = $(GCC_BIN)arm-none-eabi-size
|
||||||
|
|
||||||
CPU = -mcpu=cortex-m3 -mthumb
|
CPU = -mcpu=cortex-m3 -mthumb
|
||||||
CC_FLAGS = $(CPU) -c -g -fno-common -fmessage-length=0 -Wall -fno-exceptions -ffunction-sections -fdata-sections -fno-rtti
|
CC_FLAGS = $(CPU) -c -g -fno-common -fmessage-length=0 -Wall -fno-exceptions -ffunction-sections -fdata-sections -fomit-frame-pointer
|
||||||
CC_FLAGS += -MMD -MP
|
CC_FLAGS += -MMD -MP
|
||||||
CC_SYMBOLS = {% for s in symbols %}-D{{s}} {% endfor %}
|
CC_SYMBOLS = {% for s in symbols %}-D{{s}} {% endfor %}
|
||||||
|
|
||||||
|
|
@ -34,7 +34,7 @@ else
|
||||||
CC_FLAGS += -DNDEBUG -Os
|
CC_FLAGS += -DNDEBUG -Os
|
||||||
endif
|
endif
|
||||||
|
|
||||||
all: $(PROJECT).bin $(PROJECT).hex size
|
all: $(PROJECT).bin $(PROJECT).hex
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f $(PROJECT).bin $(PROJECT).elf $(PROJECT).hex $(PROJECT).map $(PROJECT).lst $(OBJECTS) $(DEPS)
|
rm -f $(PROJECT).bin $(PROJECT).elf $(PROJECT).hex $(PROJECT).map $(PROJECT).lst $(OBJECTS) $(DEPS)
|
||||||
|
|
@ -46,11 +46,12 @@ clean:
|
||||||
$(CC) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu99 $(INCLUDE_PATHS) -o $@ $<
|
$(CC) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu99 $(INCLUDE_PATHS) -o $@ $<
|
||||||
|
|
||||||
.cpp.o:
|
.cpp.o:
|
||||||
$(CPP) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu++98 $(INCLUDE_PATHS) -o $@ $<
|
$(CPP) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu++98 -fno-rtti $(INCLUDE_PATHS) -o $@ $<
|
||||||
|
|
||||||
|
|
||||||
$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS)
|
$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS)
|
||||||
$(LD) $(LD_FLAGS) -T$(LINKER_SCRIPT) $(LIBRARY_PATHS) -o $@ $^ $(LIBRARIES) $(LD_SYS_LIBS) $(LIBRARIES) $(LD_SYS_LIBS)
|
$(LD) $(LD_FLAGS) -T$(LINKER_SCRIPT) $(LIBRARY_PATHS) -o $@ $^ $(LIBRARIES) $(LD_SYS_LIBS) $(LIBRARIES) $(LD_SYS_LIBS)
|
||||||
|
$(SIZE) $@
|
||||||
|
|
||||||
$(PROJECT).bin: $(PROJECT).elf
|
$(PROJECT).bin: $(PROJECT).elf
|
||||||
@$(OBJCOPY) -O binary $< $@
|
@$(OBJCOPY) -O binary $< $@
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,77 @@
|
||||||
|
# This file was automagically generated by mbed.org. For more information,
|
||||||
|
# see http://mbed.org/handbook/Exporting-to-GCC-ARM-Embedded
|
||||||
|
|
||||||
|
GCC_BIN =
|
||||||
|
PROJECT = {{name}}
|
||||||
|
OBJECTS = {% for f in to_be_compiled %}{{f}} {% endfor %}
|
||||||
|
SYS_OBJECTS = {% for f in object_files %}{{f}} {% endfor %}
|
||||||
|
INCLUDE_PATHS = {% for p in include_paths %}-I{{p}} {% endfor %}
|
||||||
|
LIBRARY_PATHS = {% for p in library_paths %}-L{{p}} {% endfor %}
|
||||||
|
LIBRARIES = {% for lib in libraries %}-l{{lib}} {% endfor %}
|
||||||
|
LINKER_SCRIPT = {{linker_script}}
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
AS = $(GCC_BIN)arm-none-eabi-as
|
||||||
|
CC = $(GCC_BIN)arm-none-eabi-gcc
|
||||||
|
CPP = $(GCC_BIN)arm-none-eabi-g++
|
||||||
|
LD = $(GCC_BIN)arm-none-eabi-gcc
|
||||||
|
OBJCOPY = $(GCC_BIN)arm-none-eabi-objcopy
|
||||||
|
OBJDUMP = $(GCC_BIN)arm-none-eabi-objdump
|
||||||
|
SIZE = $(GCC_BIN)arm-none-eabi-size
|
||||||
|
|
||||||
|
CPU = -mcpu=cortex-a9 -mthumb-interwork -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=hard
|
||||||
|
CC_FLAGS = $(CPU) -c -g -fno-common -fmessage-length=0 -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers
|
||||||
|
CC_FLAGS += -fno-exceptions -fno-builtin -ffunction-sections -fdata-sections -fno-delete-null-pointer-checks -fomit-frame-pointer
|
||||||
|
CC_FLAGS += -MMD -MP -mno-unaligned-access
|
||||||
|
CC_SYMBOLS = {% for s in symbols %}-D{{s}} {% endfor %}
|
||||||
|
LD_FLAGS = $(CPU) -Wl,--gc-sections --specs=nano.specs -u _printf_float -u _scanf_float -Wl,--wrap,main
|
||||||
|
LD_FLAGS += -Wl,-Map=$(PROJECT).map,--cref
|
||||||
|
LD_SYS_LIBS = -lstdc++ -lsupc++ -lm -lc -lgcc -lnosys
|
||||||
|
|
||||||
|
ifeq ($(DEBUG), 1)
|
||||||
|
CC_FLAGS += -DDEBUG -O0
|
||||||
|
else
|
||||||
|
CC_FLAGS += -DNDEBUG -Os
|
||||||
|
endif
|
||||||
|
|
||||||
|
all: $(PROJECT).bin $(PROJECT).hex
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(PROJECT).bin $(PROJECT).elf $(PROJECT).hex $(PROJECT).map $(PROJECT).lst $(OBJECTS) $(DEPS)
|
||||||
|
|
||||||
|
.s.o:
|
||||||
|
$(AS) $(CPU) -o $@ $<
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
$(CC) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu99 $(INCLUDE_PATHS) -o $@ $<
|
||||||
|
|
||||||
|
.cpp.o:
|
||||||
|
$(CPP) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu++98 -fno-rtti $(INCLUDE_PATHS) -o $@ $<
|
||||||
|
|
||||||
|
|
||||||
|
$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS)
|
||||||
|
$(LD) $(LD_FLAGS) -T$(LINKER_SCRIPT) $(LIBRARY_PATHS) -o $@ $^ $(LIBRARIES) $(LD_SYS_LIBS) $(LIBRARIES) $(LD_SYS_LIBS)
|
||||||
|
@echo ""
|
||||||
|
@echo "*****"
|
||||||
|
@echo "***** You must modify vector checksum value in *.bin and *.hex files."
|
||||||
|
@echo "*****"
|
||||||
|
@echo ""
|
||||||
|
$(SIZE) $@
|
||||||
|
|
||||||
|
$(PROJECT).bin: $(PROJECT).elf
|
||||||
|
@$(OBJCOPY) -O binary $< $@
|
||||||
|
|
||||||
|
$(PROJECT).hex: $(PROJECT).elf
|
||||||
|
@$(OBJCOPY) -O ihex $< $@
|
||||||
|
|
||||||
|
$(PROJECT).lst: $(PROJECT).elf
|
||||||
|
@$(OBJDUMP) -Sdh $< > $@
|
||||||
|
|
||||||
|
lst: $(PROJECT).lst
|
||||||
|
|
||||||
|
size:
|
||||||
|
$(SIZE) $(PROJECT).elf
|
||||||
|
|
||||||
|
DEPS = $(OBJECTS:.o=.d) $(SYS_OBJECTS:.o=.d)
|
||||||
|
-include $(DEPS)
|
||||||
|
|
||||||
|
|
@ -75,7 +75,8 @@ class GccArm(Exporter):
|
||||||
'NRF51_DONGLE',
|
'NRF51_DONGLE',
|
||||||
'SEEED_TINY_BLE',
|
'SEEED_TINY_BLE',
|
||||||
'DISCO_F401VC',
|
'DISCO_F401VC',
|
||||||
'DELTA_DFCM_NNN40',
|
'DELTA_DFCM_NNN40',
|
||||||
|
'RZ_A1H',
|
||||||
]
|
]
|
||||||
|
|
||||||
DOT_IN_RELATIVE_PATH = True
|
DOT_IN_RELATIVE_PATH = True
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,8 @@ class IAREmbeddedWorkbench(Exporter):
|
||||||
'LPC11U24',
|
'LPC11U24',
|
||||||
'LPC11U35_401',
|
'LPC11U35_401',
|
||||||
'LPC11U35_501',
|
'LPC11U35_501',
|
||||||
'LPCCAPPUCCINO',
|
#Removed LPCCAPPUCCINO linker file and startup file missing
|
||||||
|
#'LPCCAPPUCCINO',
|
||||||
'LPC1114',
|
'LPC1114',
|
||||||
'LPC1549',
|
'LPC1549',
|
||||||
'LPC812',
|
'LPC812',
|
||||||
|
|
@ -53,7 +54,7 @@ class IAREmbeddedWorkbench(Exporter):
|
||||||
'NUCLEO_F411RE',
|
'NUCLEO_F411RE',
|
||||||
'NUCLEO_L053R8',
|
'NUCLEO_L053R8',
|
||||||
'NUCLEO_L152RE',
|
'NUCLEO_L152RE',
|
||||||
'STM32F407',
|
#'STM32F407', Fails to build same for GCC
|
||||||
'MTS_MDOT_F405RG',
|
'MTS_MDOT_F405RG',
|
||||||
'MTS_MDOT_F411RE',
|
'MTS_MDOT_F411RE',
|
||||||
'MTS_DRAGONFLY_F411RE',
|
'MTS_DRAGONFLY_F411RE',
|
||||||
|
|
@ -78,3 +79,4 @@ class IAREmbeddedWorkbench(Exporter):
|
||||||
}
|
}
|
||||||
self.gen_file('iar_%s.ewp.tmpl' % self.target.lower(), ctx, '%s.ewp' % self.program_name)
|
self.gen_file('iar_%s.ewp.tmpl' % self.target.lower(), ctx, '%s.ewp' % self.program_name)
|
||||||
self.gen_file('iar.eww.tmpl', ctx, '%s.eww' % self.program_name)
|
self.gen_file('iar.eww.tmpl', ctx, '%s.eww' % self.program_name)
|
||||||
|
self.gen_file('iar_%s.ewd.tmpl' % self.target.lower(), ctx, '%s.ewd' % self.program_name)
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -747,11 +747,11 @@
|
||||||
</option>
|
</option>
|
||||||
<option>
|
<option>
|
||||||
<name>IlinkUseExtraOptions</name>
|
<name>IlinkUseExtraOptions</name>
|
||||||
<state>0</state>
|
<state>1</state>
|
||||||
</option>
|
</option>
|
||||||
<option>
|
<option>
|
||||||
<name>IlinkExtraOptions</name>
|
<name>IlinkExtraOptions</name>
|
||||||
<state></state>
|
<state>--skip_dynamic_initialization</state>
|
||||||
</option>
|
</option>
|
||||||
<option>
|
<option>
|
||||||
<name>IlinkLowLevelInterfaceSlave</name>
|
<name>IlinkLowLevelInterfaceSlave</name>
|
||||||
|
|
@ -1693,11 +1693,11 @@
|
||||||
</option>
|
</option>
|
||||||
<option>
|
<option>
|
||||||
<name>IlinkUseExtraOptions</name>
|
<name>IlinkUseExtraOptions</name>
|
||||||
<state>0</state>
|
<state>1</state>
|
||||||
</option>
|
</option>
|
||||||
<option>
|
<option>
|
||||||
<name>IlinkExtraOptions</name>
|
<name>IlinkExtraOptions</name>
|
||||||
<state></state>
|
<state>--skip_dynamic_initialization</state>
|
||||||
</option>
|
</option>
|
||||||
<option>
|
<option>
|
||||||
<name>IlinkLowLevelInterfaceSlave</name>
|
<name>IlinkLowLevelInterfaceSlave</name>
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue