Added support for v4.2 boards
[SCSI2SD.git] / software / SCSI2SD / v4 / SCSI2SD.cydsn / Generated_Source / PSoC5 / Cm3Start.c
1 /*******************************************************************************
2 * File Name: Cm3Start.c
3 * Version 4.0
4 *
5 *  Description:
6 *  Startup code for the ARM CM3.
7 *
8 ********************************************************************************
9 * Copyright 2008-2013, Cypress Semiconductor Corporation. All rights reserved.
10 * You may use this file only in accordance with the license, terms, conditions,
11 * disclaimers, and limitations in the end user license agreement accompanying
12 * the software package with which this file was provided.
13 *******************************************************************************/
14
15 #include <limits.h>
16 #include "cydevice_trm.h"
17 #include "cytypes.h"
18 #include "cyfitter_cfg.h"
19 #include "CyLib.h"
20 #include "CyDmac.h"
21 #include "cyfitter.h"
22
23 #define CY_NUM_INTERRUPTS           (32u)
24 #define CY_NUM_VECTORS              (CYINT_IRQ_BASE + CY_NUM_INTERRUPTS)
25 #define CY_NUM_ROM_VECTORS          (4u)
26 #define CY_NVIC_APINT_PTR           ((reg32 *) CYREG_NVIC_APPLN_INTR)
27 #define CY_NVIC_CFG_CTRL_PTR        ((reg32 *) CYREG_NVIC_CFG_CONTROL)
28 #define CY_NVIC_APINT_PRIGROUP_3_5  (0x00000400u)  /* Priority group 3.5 split */
29 #define CY_NVIC_APINT_VECTKEY       (0x05FA0000u)  /* This key is required in order to write the NVIC_APINT register */
30 #define CY_NVIC_CFG_STACKALIGN      (0x00000200u)  /* This specifies that the exception stack must be 8 byte aligned */
31
32
33 /* Extern functions */
34 extern void CyBtldr_CheckLaunch(void);
35
36 /* Function prototypes */
37 void initialize_psoc(void);
38 CY_ISR(IntDefaultHandler);
39 void Reset(void);
40 CY_ISR(IntDefaultHandler);
41
42 #if defined(__ARMCC_VERSION)
43     #define INITIAL_STACK_POINTER ((cyisraddress)(uint32)&Image$$ARM_LIB_STACK$$ZI$$Limit)
44 #elif defined (__GNUC__)
45     #define INITIAL_STACK_POINTER (&__cy_stack)
46 #elif defined (__ICCARM__)
47     #pragma language=extended
48     #pragma segment="CSTACK"
49     #define INITIAL_STACK_POINTER  { .__ptr = __sfe( "CSTACK" ) }
50
51     extern void __iar_program_start( void );
52     extern void __iar_data_init3 (void);
53 #endif  /* (__ARMCC_VERSION) */
54
55 /* Global variables */
56 #if !defined (__ICCARM__)
57     CY_NOINIT static uint32 cySysNoInitDataValid;
58 #endif  /* !defined (__ICCARM__) */
59
60
61 /*******************************************************************************
62 * Default Ram Interrupt Vector table storage area. Must be 256-byte aligned.
63 *******************************************************************************/
64 #if defined (__ICCARM__)
65     #pragma location=".ramvectors"
66     #pragma data_alignment=256
67 #else
68     CY_SECTION(".ramvectors")
69     CY_ALIGN(256)
70 #endif  /* defined (__ICCARM__) */
71 cyisraddress CyRamVectors[CY_NUM_VECTORS];
72
73
74 /*******************************************************************************
75 * Function Name: IntDefaultHandler
76 ********************************************************************************
77 *
78 * Summary:
79 *  This function is called for all interrupts, other than reset, that get
80 *  called before the system is setup.
81 *
82 * Parameters:
83 *  None
84 *
85 * Return:
86 *  None
87 *
88 * Theory:
89 *  Any value other than zero is acceptable.
90 *
91 *******************************************************************************/
92 CY_ISR(IntDefaultHandler)
93 {
94
95     while(1)
96     {
97         /***********************************************************************
98         * We should never get here. If we do, a serious problem occured, so go
99         * into an infinite loop.
100         ***********************************************************************/
101     }
102 }
103
104
105 #if defined(__ARMCC_VERSION)
106
107 /* Local function for the device reset. */
108 extern void Reset(void);
109
110 /* Application entry point. */
111 extern void $Super$$main(void);
112
113 /* Linker-generated Stack Base addresses, Two Region and One Region */
114 extern uint32 Image$$ARM_LIB_STACK$$ZI$$Limit;
115
116 /* RealView C Library initialization. */
117 extern int __main(void);
118
119
120 /*******************************************************************************
121 * Function Name: Reset
122 ********************************************************************************
123 *
124 * Summary:
125 *  This function handles the reset interrupt for the RVDS/MDK toolchains.
126 *  This is the first bit of code that is executed at startup.
127 *
128 * Parameters:
129 *  None
130 *
131 * Return:
132 *  None
133 *
134 *******************************************************************************/
135 void Reset(void)
136 {
137     #if(CYDEV_PROJ_TYPE != CYDEV_PROJ_TYPE_LOADABLE)
138
139         /* For PSoC 5LP, debugging is enabled by default */
140         #if(CYDEV_DEBUGGING_ENABLE == 0)
141             *(reg32 *)(CYDEV_DEBUG_ENABLE_REGISTER) |= CYDEV_DEBUG_ENABLE_MASK;
142         #endif /* (CYDEV_DEBUGGING_ENABLE) */
143
144         /* Reset Status Register has Read-to-clear SW access mode.
145         * Preserve current RESET_SR0 state to make it available for next reading.
146         */
147         *(reg32 *)(CYREG_PHUB_CFGMEM23_CFG1) = *(reg32 *)(CYREG_RESET_SR0);
148
149     #endif  /* (CYDEV_PROJ_TYPE != CYDEV_PROJ_TYPE_LOADABLE) */
150
151     #if(CYDEV_BOOTLOADER_ENABLE)
152         CyBtldr_CheckLaunch();
153     #endif /* (CYDEV_BOOTLOADER_ENABLE) */
154
155     __main();
156 }
157
158
159 /*******************************************************************************
160 * Function Name: $Sub$$main
161 ********************************************************************************
162 *
163 * Summary:
164 *  This function is called imediatly before the users main
165 *
166 * Parameters:
167 *  None
168 *
169 * Return:
170 *  None
171 *
172 *******************************************************************************/
173 void $Sub$$main(void)
174 {
175     initialize_psoc();
176
177     /* Call original main */
178     $Super$$main();
179
180     while (1)
181     {
182         /* If main returns it is undefined what we should do. */
183     }
184 }
185
186 #elif defined(__GNUC__)
187
188 void Start_c(void);
189
190 /* Stack Base address */
191 extern void __cy_stack(void);
192
193 /* Application entry point. */
194 extern int main(void);
195
196 /* The static objects constructors initializer */
197 extern void __libc_init_array(void);
198
199 typedef unsigned char __cy_byte_align8 __attribute ((aligned (8)));
200
201 struct __cy_region
202 {
203     __cy_byte_align8 *init; /* Initial contents of this region.  */
204     __cy_byte_align8 *data; /* Start address of region.  */
205     size_t init_size;       /* Size of initial data.  */
206     size_t zero_size;       /* Additional size to be zeroed.  */
207 };
208
209 extern const struct __cy_region __cy_regions[];
210 extern const char __cy_region_num __attribute__((weak));
211 #define __cy_region_num ((size_t)&__cy_region_num)
212
213
214 /*******************************************************************************
215 * Function Name: Reset
216 ********************************************************************************
217 *
218 * Summary:
219 *  This function handles the reset interrupt for the GCC toolchain. This is the
220 *  first bit of code that is executed at startup.
221 *
222 * Parameters:
223 *  None
224 *
225 * Return:
226 *  None
227 *
228 *******************************************************************************/
229 void Reset(void)
230 {
231     #if(CYDEV_PROJ_TYPE != CYDEV_PROJ_TYPE_LOADABLE)
232
233         /* For PSoC 5LP, debugging is enabled by default */
234         #if(CYDEV_DEBUGGING_ENABLE == 0)
235             *(reg32 *)(CYDEV_DEBUG_ENABLE_REGISTER) |= CYDEV_DEBUG_ENABLE_MASK;
236         #endif /* (CYDEV_DEBUGGING_ENABLE) */
237
238         /* Reset Status Register has Read-to-clear SW access mode.
239         * Preserve current RESET_SR0 state to make it available for next reading.
240         */
241         *(reg32 *)(CYREG_PHUB_CFGMEM23_CFG1) = *(reg32 *)(CYREG_RESET_SR0);
242
243     #endif  /* (CYDEV_PROJ_TYPE != CYDEV_PROJ_TYPE_LOADABLE) */
244
245     #if(CYDEV_BOOTLOADER_ENABLE)
246         CyBtldr_CheckLaunch();
247     #endif /* (CYDEV_BOOTLOADER_ENABLE) */
248
249     Start_c();
250 }
251
252 __attribute__((weak))
253 void _exit(int status)
254 {
255     /* Cause a divide by 0 exception */
256     int x = status / INT_MAX;
257     x = 4 / x;
258
259     while(1)
260     {
261     }
262 }
263
264 /*******************************************************************************
265 * Function Name: Start_c
266 ********************************************************************************
267 *
268 * Summary:
269 *  This function handles initializing the .data and .bss sections in
270 *  preperation for running standard C code.  Once initialization is complete
271 *  it will call main(). This function will never return.
272 *
273 * Parameters:
274 *  None
275 *
276 * Return:
277 *  None
278 *
279 *******************************************************************************/
280 void Start_c(void)  __attribute__ ((noreturn));
281 void Start_c(void)
282 {
283     unsigned regions = __cy_region_num;
284     const struct __cy_region *rptr = __cy_regions;
285
286     /* Initialize memory */
287     for (regions = __cy_region_num, rptr = __cy_regions; regions--; rptr++)
288     {
289         uint32 *src = (uint32 *)rptr->init;
290         uint32 *dst = (uint32 *)rptr->data;
291         unsigned limit = rptr->init_size;
292         unsigned count;
293
294         for (count = 0u; count != limit; count += sizeof (uint32))
295         {
296             *dst++ = *src++;
297         }
298         limit = rptr->zero_size;
299         for (count = 0u; count != limit; count += sizeof (uint32))
300         {
301             *dst++ = 0u;
302         }
303     }
304
305     /* Invoke static objects constructors */
306     __libc_init_array();
307     (void) main();
308
309     while (1)
310     {
311         /* If main returns, make sure we don't return. */
312     }
313 }
314
315
316 #elif defined (__ICCARM__)
317
318 /*******************************************************************************
319 * Function Name: __low_level_init
320 ********************************************************************************
321 *
322 * Summary:
323 *  This function perform early initializations for the IAR Embedded
324 *  Workbench IDE. It is executed in the context of reset interrupt handler
325 *  before the data sections are initialized.
326 *
327 * Parameters:
328 *  None
329 *
330 * Return:
331 *  The value that determines whether or not data sections should be initialized
332 *  by the system startup code:
333 *    0 - skip data sections initialization;
334 *    1 - initialize data sections;
335 *
336 *******************************************************************************/
337 int __low_level_init(void)
338 {
339     #if(CYDEV_PROJ_TYPE != CYDEV_PROJ_TYPE_LOADABLE)
340
341         /* For PSoC 5LP, debugging is enabled by default */
342         #if(CYDEV_DEBUGGING_ENABLE == 0)
343             *(reg32 *)(CYDEV_DEBUG_ENABLE_REGISTER) |= CYDEV_DEBUG_ENABLE_MASK;
344         #endif /* (CYDEV_DEBUGGING_ENABLE) */
345
346         /* Reset Status Register has Read-to-clear SW access mode.
347         * Preserve current RESET_SR0 state to make it available for next reading.
348         */
349         *(reg32 *)(CYREG_PHUB_CFGMEM23_CFG1) = *(reg32 *)(CYREG_RESET_SR0);
350
351     #endif  /* (CYDEV_PROJ_TYPE != CYDEV_PROJ_TYPE_LOADABLE) */
352
353     #if (CYDEV_BOOTLOADER_ENABLE)
354         CyBtldr_CheckLaunch();
355     #endif /* CYDEV_BOOTLOADER_ENABLE */
356
357     /* Initialize data sections */
358     __iar_data_init3();
359
360     initialize_psoc();
361
362     return 0;
363 }
364
365 #endif /* __GNUC__ */
366
367
368 /*******************************************************************************
369 *
370 * Default Rom Interrupt Vector table.
371 *
372 *******************************************************************************/
373 #if defined(__ARMCC_VERSION)
374     /* Suppress diagnostic message 1296-D: extended constant initialiser used */
375     #pragma diag_suppress 1296
376 #endif  /* defined(__ARMCC_VERSION) */
377
378 #if defined (__ICCARM__)
379     #pragma location=".romvectors"
380     const intvec_elem __vector_table[CY_NUM_ROM_VECTORS] =
381 #else
382     CY_SECTION(".romvectors")
383     const cyisraddress RomVectors[CY_NUM_ROM_VECTORS] =
384 #endif  /* defined (__ICCARM__) */
385 {
386     INITIAL_STACK_POINTER,   /* The initial stack pointer  0 */
387     #if defined (__ICCARM__) /* The reset handler          1 */
388         __iar_program_start,
389     #else
390         (cyisraddress)&Reset,
391     #endif  /* defined (__ICCARM__) */
392     &IntDefaultHandler,      /* The NMI handler            2 */
393     &IntDefaultHandler,      /* The hard fault handler     3 */
394 };
395
396 #if defined(__ARMCC_VERSION)
397     #pragma diag_default 1296
398 #endif  /* defined(__ARMCC_VERSION) */
399
400
401 /*******************************************************************************
402 * Function Name: initialize_psoc
403 ********************************************************************************
404 *
405 * Summary:
406 *  This function used to initialize the PSoC chip before calling main.
407 *
408 * Parameters:
409 *  None
410 *
411 * Return:
412 *  None
413 *
414 *******************************************************************************/
415 #if (defined(__GNUC__) && !defined(__ARMCC_VERSION))
416 __attribute__ ((constructor(101)))
417 #endif
418 void initialize_psoc(void)
419 {
420     uint32 i;
421
422     /* Set Priority group 5. */
423
424     /* Writes to NVIC_APINT register require the VECTKEY in the upper half */
425     *CY_NVIC_APINT_PTR = CY_NVIC_APINT_VECTKEY | CY_NVIC_APINT_PRIGROUP_3_5;
426     *CY_NVIC_CFG_CTRL_PTR |= CY_NVIC_CFG_STACKALIGN;
427
428     /* Set Ram interrupt vectors to default functions. */
429     for (i = 0u; i < CY_NUM_VECTORS; i++)
430     {
431         #if defined (__ICCARM__)
432             CyRamVectors[i] = (i < CY_NUM_ROM_VECTORS) ? __vector_table[i].__fun : &IntDefaultHandler;
433         #else
434             CyRamVectors[i] = (i < CY_NUM_ROM_VECTORS) ? RomVectors[i] : &IntDefaultHandler;
435         #endif  /* defined (__ICCARM__) */
436     }
437
438     /* Was stored in CFGMEM to avoid being cleared while SRAM gets cleared */
439     CyResetStatus = CY_GET_REG8(CYREG_PHUB_CFGMEM23_CFG1);
440
441     /* Point NVIC at the RAM vector table. */
442     *CYINT_VECT_TABLE = CyRamVectors;
443
444     /* Initialize the configuration registers. */
445     cyfitter_cfg();
446
447     #if(0u != DMA_CHANNELS_USED__MASK0)
448
449         /* Setup DMA - only necessary if the design contains a DMA component. */
450         CyDmacConfigure();
451
452     #endif  /* (0u != DMA_CHANNELS_USED__MASK0) */
453
454     #if !defined (__ICCARM__)
455         /* Actually, no need to clean this variable, just to make compiler happy. */
456         cySysNoInitDataValid = 0u;
457     #endif  /* !defined (__ICCARM__) */
458 }
459
460
461 /* [] END OF FILE */