| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- /*******************************************************************************
- * File Name: CyBootAsmGnu.s
- * Version 4.0
- *
- * Description:
- * Assembly routines for GNU as.
- *
- ********************************************************************************
- * Copyright 2010-2013, Cypress Semiconductor Corporation. All rights reserved.
- * You may use this file only in accordance with the license, terms, conditions,
- * disclaimers, and limitations in the end user license agreement accompanying
- * the software package with which this file was provided.
- *******************************************************************************/
- .include "cyfittergnu.inc"
- .syntax unified
- .text
- .thumb
- /*******************************************************************************
- * Function Name: CyDelayCycles
- ********************************************************************************
- *
- * Summary:
- * Delays for the specified number of cycles.
- *
- * Parameters:
- * uint32 cycles: number of cycles to delay.
- *
- * Return:
- * None
- *
- *******************************************************************************/
- /* void CyDelayCycles(uint32 cycles) */
- .align 3 /* Align to 8 byte boundary (2^n) */
- .global CyDelayCycles
- .func CyDelayCycles, CyDelayCycles
- .type CyDelayCycles, %function
- .thumb_func
- CyDelayCycles: /* cycles bytes */
- /* If ICache is enabled */
- .ifeq CYDEV_INSTRUCT_CACHE_ENABLED - 1
- ADDS r0, r0, #2 /* 1 2 Round to nearest multiple of 4 */
- LSRS r0, r0, #2 /* 1 2 Divide by 4 and set flags */
- BEQ CyDelayCycles_done /* 2 2 Skip if 0 */
- NOP /* 1 2 Loop alignment padding */
- CyDelayCycles_loop:
- SUBS r0, r0, #1 /* 1 2 */
- MOV r0, r0 /* 1 2 Pad loop to power of two cycles */
- BNE CyDelayCycles_loop /* 2 2 */
- CyDelayCycles_done:
- BX lr /* 3 2 */
- .else
- CMP r0, #20 /* 1 2 If delay is short - jump to cycle */
- BLS CyDelayCycles_short /* 1 2 */
- PUSH {r1} /* 2 2 PUSH r1 to stack */
- MOVS r1, #1 /* 1 2 */
- SUBS r0, r0, #20 /* 1 2 Subtract overhead */
- LDR r1,=CYREG_CACHE_CC_CTL/* 2 2 Load flash wait cycles value */
- LDRB r1, [r1, #0] /* 2 2 */
- ANDS r1, #0xC0 /* 1 2 */
- LSRS r1, r1, #6 /* 1 2 */
- PUSH {r2} /* 1 2 PUSH r2 to stack */
- LDR r2, =cy_flash_cycles /* 2 2 */
- LDRB r1, [r2, r1] /* 2 2 */
- POP {r2} /* 2 2 POP r2 from stack */
- NOP /* 1 2 Alignment padding */
- NOP /* 1 2 Alignment padding */
- NOP /* 1 2 Alignment padding */
- CyDelayCycles_loop:
- SBCS r0, r0, r1 /* 1 2 */
- BPL CyDelayCycles_loop /* 3 2 */
- NOP /* 1 2 Loop alignment padding */
- NOP /* 1 2 Loop alignment padding */
- POP {r1} /* 2 2 POP r1 from stack */
- CyDelayCycles_done:
- BX lr /* 3 2 */
- NOP /* 1 2 Alignment padding */
- NOP /* 1 2 Alignment padding */
- CyDelayCycles_short:
- SBCS r0, r0, #4 /* 1 2 */
- BPL CyDelayCycles_short /* 3 2 */
- BX lr /* 3 2 */
- cy_flash_cycles:
- .byte 0x0B
- .byte 0x05
- .byte 0x07
- .byte 0x09
- .endif
- .endfunc
- /*******************************************************************************
- * Function Name: CyEnterCriticalSection
- ********************************************************************************
- *
- * Summary:
- * CyEnterCriticalSection disables interrupts and returns a value indicating
- * whether interrupts were previously enabled (the actual value depends on
- * whether the device is PSoC 3 or PSoC 5).
- *
- * Note Implementation of CyEnterCriticalSection manipulates the IRQ enable bit
- * with interrupts still enabled. The test and set of the interrupt bits is not
- * atomic; this is true for both PSoC 3 and PSoC 5. Therefore, to avoid
- * corrupting processor state, it must be the policy that all interrupt routines
- * restore the interrupt enable bits as they were found on entry.
- *
- * Parameters:
- * None
- *
- * Return:
- * uint8
- * Returns 0 if interrupts were previously enabled or 1 if interrupts
- * were previously disabled.
- *
- *******************************************************************************/
- /* uint8 CyEnterCriticalSection(void) */
- .global CyEnterCriticalSection
- .func CyEnterCriticalSection, CyEnterCriticalSection
- .type CyEnterCriticalSection, %function
- .thumb_func
- CyEnterCriticalSection:
- MRS r0, PRIMASK /* Save and return interrupt state */
- CPSID I /* Disable interrupts */
- BX lr
- .endfunc
- /*******************************************************************************
- * Function Name: CyExitCriticalSection
- ********************************************************************************
- *
- * Summary:
- * CyExitCriticalSection re-enables interrupts if they were enabled before
- * CyEnterCriticalSection was called. The argument should be the value returned
- * from CyEnterCriticalSection.
- *
- * Parameters:
- * uint8 savedIntrStatus:
- * Saved interrupt status returned by the CyEnterCriticalSection function.
- *
- * Return:
- * None
- *
- *******************************************************************************/
- /* void CyExitCriticalSection(uint8 savedIntrStatus) */
- .global CyExitCriticalSection
- .func CyExitCriticalSection, CyExitCriticalSection
- .type CyExitCriticalSection, %function
- .thumb_func
- CyExitCriticalSection:
- MSR PRIMASK, r0 /* Restore interrupt state */
- BX lr
- .endfunc
- .end
- /* [] END OF FILE */
|