/*
 * Copyright (C) 2017 C-SKY Microsystems Co., Ltd. All rights reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 */

#ifndef PORTMACRO_H
    #define PORTMACRO_H

    #include <stdlib.h>
    #include <stdint.h>
    #include <csi_core.h>

    extern void vPortYield( void );
    #ifdef __cplusplus
        class vPortYield;
        extern "C" {
    #endif


/*-----------------------------------------------------------
 * Port specific definitions.
 *
 * The settings in this file configure FreeRTOS correctly for the
 * given hardware and compiler.
 *
 * These settings should not be altered.
 *-----------------------------------------------------------
 */

/* Type definitions. */
    #define portCHAR          char
    #define portFLOAT         float
    #define portDOUBLE        double
    #define portLONG          long
    #define portSHORT         short
    #define portSTACK_TYPE    uint32_t
    #define portBASE_TYPE     long

    typedef portSTACK_TYPE   StackType_t;
    typedef long             BaseType_t;
    typedef unsigned long    UBaseType_t;
    typedef void (* portvectorfunc)( void );

    #if ( configUSE_16_BIT_TICKS == 1 )
        typedef uint16_t     TickType_t;
        #define portMAX_DELAY    ( TickType_t ) 0xffff
    #else
        typedef uint32_t     TickType_t;
        #define portMAX_DELAY    ( TickType_t ) 0xffffffffUL
    #endif


/* Hardware specifics. */
    #define portBYTE_ALIGNMENT    8
    #define portSTACK_GROWTH      -1
    #define portMS_PERIOD_TICK    10
    #define portTICK_PERIOD_MS    ( ( TickType_t ) 1000 / configTICK_RATE_HZ )


    static inline void vPortEnableInterrupt( void )
    {
        __enable_irq();
    }

    static inline void vPortDisableInterrupt( void )
    {
        __disable_irq();
    }

    static inline portLONG GetCurrentPSR( void )
    {
        return __get_PSR();
    }

    static inline portLONG SaveLocalPSR( void )
    {
        portLONG flags = __get_PSR();

        __disable_irq();
        return flags;
    }

    static inline void RestoreLocalPSR( portLONG newMask )
    {
        __asm__ __volatile__ (
            "mtcr   %0, psr \n"
            :
            : "r" ( newMask )
            : "memory"
            );
    }

    extern void vPortEnterCritical( void );
    extern void vPortExitCritical( void );
    extern __attribute__( ( naked ) ) void cpu_yeild( void );

    #define portDISABLE_INTERRUPTS()                  vPortDisableInterrupt()
    #define portENABLE_INTERRUPTS()                   vPortEnableInterrupt()
    #define portENTER_CRITICAL()                      vPortEnterCritical()
    #define portEXIT_CRITICAL()                       vPortExitCritical()
    #define portSET_INTERRUPT_MASK_FROM_ISR()         SaveLocalPSR()
    #define portCLEAR_INTERRUPT_MASK_FROM_ISR( a )    RestoreLocalPSR( a )

    #define portNOP()                                 asm ( "nop" )

    extern portLONG ulCriticalNesting;
    extern portLONG pendsvflag;

    #define portYIELD()          \
    if( ulCriticalNesting == 0 ) \
    {                            \
        vPortYield();            \
    }                            \
    else                         \
    {                            \
        pendsvflag = 1;          \
    }                            \
    portNOP(); portNOP()

/*-----------------------------------------------------------*/

/* Task function macros as described on the FreeRTOS.org WEB site. */
    #define portTASK_FUNCTION_PROTO( vFunction, pvParameters )    void vFunction( void * pvParameters ) __attribute__( ( noreturn ) )
    #define portTASK_FUNCTION( vFunction, pvParameters )          void vFunction( void * pvParameters )
/*-----------------------------------------------------------*/

    #define portEND_SWITCHING_ISR( xSwitchRequired ) \
    do {                                             \
        if( xSwitchRequired != pdFALSE )             \
        {                                            \
            portYIELD();                             \
        }                                            \
    } while( 0 )

    #define portYIELD_FROM_ISR( a )    vTaskSwitchContext()



    #ifdef __cplusplus
        }
    #endif

#endif /* PORTMACRO_H */
