Added support for v4.2 boards
[SCSI2SD.git] / software / SCSI2SD / v4 / SCSI2SD.cydsn / Generated_Source / PSoC5 / CyBootAsmGnu.s
1 /*******************************************************************************
2 * File Name: CyBootAsmGnu.s
3 * Version 4.0
4 *
5 *  Description:
6 *   Assembly routines for GNU as.
7 *
8 ********************************************************************************
9 * Copyright 2010-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 "cyfittergnu.inc"
16
17 .syntax unified
18 .text
19 .thumb
20
21
22 /*******************************************************************************
23 * Function Name: CyDelayCycles
24 ********************************************************************************
25 *
26 * Summary:
27 *  Delays for the specified number of cycles.
28 *
29 * Parameters:
30 *  uint32 cycles: number of cycles to delay.
31 *
32 * Return:
33 *  None
34 *
35 *******************************************************************************/
36 /* void CyDelayCycles(uint32 cycles) */
37 .align 3                    /* Align to 8 byte boundary (2^n) */
38 .global CyDelayCycles
39 .func CyDelayCycles, CyDelayCycles
40 .type CyDelayCycles, %function
41 .thumb_func
42 CyDelayCycles:              /* cycles bytes */
43 /* If ICache is enabled */
44 .ifeq CYDEV_INSTRUCT_CACHE_ENABLED - 1
45
46     ADDS r0, r0, #2           /*  1    2   Round to nearest multiple of 4 */
47     LSRS r0, r0, #2           /*  1    2   Divide by 4 and set flags */
48     BEQ CyDelayCycles_done    /*  2    2   Skip if 0 */
49     NOP                       /*  1    2   Loop alignment padding */
50
51 CyDelayCycles_loop:
52     SUBS r0, r0, #1           /*  1    2 */
53     MOV r0, r0                /*  1    2   Pad loop to power of two cycles */
54     BNE CyDelayCycles_loop    /*  2    2 */
55
56 CyDelayCycles_done:
57     BX lr                     /*  3    2 */
58
59 .else
60
61     CMP r0, #20               /*  1    2   If delay is short - jump to cycle */
62     BLS CyDelayCycles_short   /*  1    2  */
63     PUSH {r1}                 /*  2    2   PUSH r1 to stack */
64     MOVS r1, #1               /*  1    2  */
65
66     SUBS r0, r0, #20          /*  1    2   Subtract overhead */
67     LDR r1,=CYREG_CACHE_CC_CTL/*  2    2   Load flash wait cycles value */
68     LDRB r1, [r1, #0]         /*  2    2  */
69     ANDS r1, #0xC0            /*  1    2  */
70
71     LSRS r1, r1, #6           /*  1    2  */
72     PUSH {r2}                 /*  1    2   PUSH r2 to stack */
73     LDR r2, =cy_flash_cycles  /*  2    2  */
74     LDRB r1, [r2, r1]         /*  2    2  */
75
76     POP {r2}                  /*  2    2   POP r2 from stack */
77     NOP                       /*  1    2   Alignment padding */
78     NOP                       /*  1    2   Alignment padding */
79     NOP                       /*  1    2   Alignment padding */
80
81 CyDelayCycles_loop:
82     SBCS r0, r0, r1           /*  1    2  */
83     BPL CyDelayCycles_loop    /*  3    2  */
84     NOP                       /*  1    2   Loop alignment padding */
85     NOP                       /*  1    2   Loop alignment padding */
86
87     POP {r1}                  /*  2    2   POP r1 from stack */
88 CyDelayCycles_done:
89     BX lr                     /*  3    2  */
90     NOP                       /*  1    2   Alignment padding */
91     NOP                       /*  1    2   Alignment padding */
92
93 CyDelayCycles_short:
94     SBCS r0, r0, #4           /*  1    2  */
95     BPL CyDelayCycles_short   /*  3    2  */
96     BX lr                     /*  3    2  */
97
98 cy_flash_cycles:
99 .byte 0x0B
100 .byte 0x05
101 .byte 0x07
102 .byte 0x09
103 .endif
104
105 .endfunc
106
107
108 /*******************************************************************************
109 * Function Name: CyEnterCriticalSection
110 ********************************************************************************
111 *
112 * Summary:
113 *  CyEnterCriticalSection disables interrupts and returns a value indicating
114 *  whether interrupts were previously enabled (the actual value depends on
115 *  whether the device is PSoC 3 or PSoC 5).
116 *
117 *  Note Implementation of CyEnterCriticalSection manipulates the IRQ enable bit
118 *  with interrupts still enabled. The test and set of the interrupt bits is not
119 *  atomic; this is true for both PSoC 3 and PSoC 5. Therefore, to avoid
120 *  corrupting processor state, it must be the policy that all interrupt routines
121 *  restore the interrupt enable bits as they were found on entry.
122 *
123 * Parameters:
124 *  None
125 *
126 * Return:
127 *  uint8
128 *   Returns 0 if interrupts were previously enabled or 1 if interrupts
129 *   were previously disabled.
130 *
131 *******************************************************************************/
132 /* uint8 CyEnterCriticalSection(void) */
133 .global CyEnterCriticalSection
134 .func CyEnterCriticalSection, CyEnterCriticalSection
135 .type CyEnterCriticalSection, %function
136 .thumb_func
137 CyEnterCriticalSection:
138     MRS r0, PRIMASK         /* Save and return interrupt state */
139     CPSID I                 /* Disable interrupts */
140     BX lr
141 .endfunc
142
143
144 /*******************************************************************************
145 * Function Name: CyExitCriticalSection
146 ********************************************************************************
147 *
148 * Summary:
149 *  CyExitCriticalSection re-enables interrupts if they were enabled before
150 *  CyEnterCriticalSection was called. The argument should be the value returned
151 *  from CyEnterCriticalSection.
152 *
153 * Parameters:
154 *  uint8 savedIntrStatus:
155 *   Saved interrupt status returned by the CyEnterCriticalSection function.
156 *
157 * Return:
158 *  None
159 *
160 *******************************************************************************/
161 /* void CyExitCriticalSection(uint8 savedIntrStatus) */
162 .global CyExitCriticalSection
163 .func CyExitCriticalSection, CyExitCriticalSection
164 .type CyExitCriticalSection, %function
165 .thumb_func
166 CyExitCriticalSection:
167     MSR PRIMASK, r0         /* Restore interrupt state */
168     BX lr
169 .endfunc
170
171 .end
172
173
174 /* [] END OF FILE */