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