/*
 * FreeRTOS Kernel V10.3.1
 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates.  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.
 *
 * http://www.FreeRTOS.org
 * http://aws.amazon.com/freertos
 *
 */

/*-----------------------------------------------------------
* Implementation of functions defined in portable.h for the Cygnal port.
*----------------------------------------------------------*/

/* Standard includes. */
#include <string.h>

/* Scheduler includes. */
#include "FreeRTOS.h"
#include "task.h"

/* Constants required to setup timer 2 to produce the RTOS tick. */
#define portCLOCK_DIVISOR               ( ( uint32_t ) 12 )
#define portMAX_TIMER_VALUE             ( ( uint32_t ) 0xffff )
#define portENABLE_TIMER                ( ( uint8_t ) 0x04 )
#define portTIMER_2_INTERRUPT_ENABLE    ( ( uint8_t ) 0x20 )

/* The value used in the IE register when a task first starts. */
#define portGLOBAL_INTERRUPT_BIT        ( ( StackType_t ) 0x80 )

/* The value used in the PSW register when a task first starts. */
#define portINITIAL_PSW                 ( ( StackType_t ) 0x00 )

/* Macro to clear the timer 2 interrupt flag. */
#define portCLEAR_INTERRUPT_FLAG()    TMR2CN &= ~0x80;

/* Used during a context switch to store the size of the stack being copied
 * to or from XRAM. */
data static uint8_t             ucStackBytes;

/* Used during a context switch to point to the next byte in XRAM from/to which
 * a RAM byte is to be copied. */
xdata static StackType_t * data pxXRAMStack;

/* Used during a context switch to point to the next byte in RAM from/to which
 * an XRAM byte is to be copied. */
data static StackType_t * data  pxRAMStack;

/* We require the address of the pxCurrentTCB variable, but don't want to know
 * any details of its type. */
typedef void TCB_t;
extern volatile TCB_t * volatile pxCurrentTCB;

/*
 * Setup the hardware to generate an interrupt off timer 2 at the required
 * frequency.
 */
static void prvSetupTimerInterrupt( void );

/*-----------------------------------------------------------*/

/*
 * Macro that copies the current stack from internal RAM to XRAM.  This is
 * required as the 8051 only contains enough internal RAM for a single stack,
 * but we have a stack for every task.
 */
#define portCOPY_STACK_TO_XRAM() \
    {                            \
        /* pxCurrentTCB points to a TCB which itself points to the location into \
         * which the first	stack byte should be copied.  Set pxXRAMStack to point \
         * to the location into which the first stack byte is to be copied. */              \
        pxXRAMStack   = ( xdata StackType_t * ) *( ( xdata StackType_t ** ) pxCurrentTCB ); \
                                                                                            \
        /* Set pxRAMStack to point to the first byte to be coped from the stack. */         \
        pxRAMStack    = ( data StackType_t * data ) configSTACK_START;                      \
                                                                                            \
        /* Calculate the size of the stack we are about to copy from the current \
         * stack pointer value. */                      \
        ucStackBytes  = SP - ( configSTACK_START - 1 ); \
                                                        \
        /* Before starting to copy the stack, store the calculated stack size so \
         * the stack can be restored when the task is resumed. */\
        * pxXRAMStack = ucStackBytes;                      \
                                                           \
        /* Copy each stack byte in turn.  pxXRAMStack is incremented first as we \
         * have already stored the stack size into XRAM. */\
        while( ucStackBytes )                        \
        {                                            \
            pxXRAMStack ++;                          \
            * pxXRAMStack = * pxRAMStack;            \
            pxRAMStack ++;                           \
            ucStackBytes --;                         \
        }                                            \
    }
/*-----------------------------------------------------------*/

/*
 * Macro that copies the stack of the task being resumed from XRAM into
 * internal RAM.
 */
#define portCOPY_XRAM_TO_STACK() \
    {                            \
        /* Setup the pointers as per portCOPY_STACK_TO_XRAM(), but this time to \
         * copy the data back out of XRAM and into the stack. */                           \
        pxXRAMStack  = ( xdata StackType_t * ) *( ( xdata StackType_t ** ) pxCurrentTCB ); \
        pxRAMStack   = ( data StackType_t * data )( configSTACK_START - 1 );               \
                                                                                           \
        /* The first value stored in XRAM was the size of the stack - i.e. the \
         * number of bytes we need to copy back. */                      \
        ucStackBytes = pxXRAMStack[ 0 ];                                 \
                                                                         \
        /* Copy the required number of bytes back into the stack. */     \
        do                                                               \
        {                                                                \
            pxXRAMStack ++;                                              \
            pxRAMStack ++;                                               \
            * pxRAMStack = * pxXRAMStack;                                \
            ucStackBytes --;                                             \
        } while( ucStackBytes );                                         \
                                                                         \
        /* Restore the stack pointer ready to use the restored stack. */ \
        SP           = ( uint8_t ) pxRAMStack;                           \
    }
/*-----------------------------------------------------------*/

/*
 * Macro to push the current execution context onto the stack, before the stack
 * is moved to XRAM.
 */
#define portSAVE_CONTEXT() \
    {                      \
        _asm               \
        /* Push ACC first, as when restoring the context it must be restored \
         * last (it is used to set the IE register). */      \
        push ACC                                             \
        /* Store the IE register then disable interrupts. */ \
        push IE                                              \
        clr _EA                                              \
        push DPL                                             \
        push DPH                                             \
        push b                                               \
        push ar2                                             \
        push ar3                                             \
        push ar4                                             \
        push ar5                                             \
        push ar6                                             \
        push ar7                                             \
        push ar0                                             \
        push ar1                                             \
        push PSW                                             \
        _endasm;                                             \
        PSW = 0;                                             \
        _asm                                                 \
        push _bp                                             \
        _endasm;                                             \
    }
/*-----------------------------------------------------------*/

/*
 * Macro that restores the execution context from the stack.  The execution
 * context was saved into the stack before the stack was copied into XRAM.
 */
#define portRESTORE_CONTEXT() \
    {                         \
        _asm                  \
        pop _bp               \
        pop PSW               \
        pop ar1               \
        pop ar0               \
        pop ar7               \
        pop ar6               \
        pop ar5               \
        pop ar4               \
        pop ar3               \
        pop ar2               \
        pop b                 \
        pop DPH               \
        pop DPL               \
        /* The next byte of the stack is the IE register.  Only the global \
         * enable bit forms part of the task context.  Pop off the IE then set \
         * the global enable bit to match that of the stored IE register. */\
        pop ACC                                                            \
        JB ACC .7, 00 98$                                                  \
        CLR IE .7                                                          \
        LJMP 00 99$                                                        \
        00 98$ :                                                           \
        SETB IE .7                                                         \
        00 99$ :                                                           \
        /* Finally pop off the ACC, which was the first register saved. */ \
        pop ACC                                                            \
        reti                                                               \
        _endasm;                                                           \
    }
/*-----------------------------------------------------------*/

/*
 * See header file for description.
 */
StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
                                     TaskFunction_t pxCode,
                                     void * pvParameters )
{
    uint32_t      ulAddress;
    StackType_t * pxStartOfStack;

    /* Leave space to write the size of the stack as the first byte. */
    pxStartOfStack  = pxTopOfStack;
    pxTopOfStack++;

    /* Place a few bytes of known values on the bottom of the stack.
     * This is just useful for debugging and can be uncommented if required.
     * pxTopOfStack = 0x11;
     * pxTopOfStack++;
     * pxTopOfStack = 0x22;
     * pxTopOfStack++;
     * pxTopOfStack = 0x33;
     * pxTopOfStack++;
     */

    /* Simulate how the stack would look after a call to the scheduler tick
     * ISR.
     *
     * The return address that would have been pushed by the MCU. */
    ulAddress       = ( uint32_t ) pxCode;
    *pxTopOfStack   = ( StackType_t ) ulAddress;
    ulAddress     >>= 8;
    pxTopOfStack++;
    *pxTopOfStack   = ( StackType_t ) ( ulAddress );
    pxTopOfStack++;

    /* Next all the registers will have been pushed by portSAVE_CONTEXT(). */
    *pxTopOfStack   = 0xaa; /* acc */
    pxTopOfStack++;

    /* We want tasks to start with interrupts enabled. */
    *pxTopOfStack   = portGLOBAL_INTERRUPT_BIT;
    pxTopOfStack++;

    /* The function parameters will be passed in the DPTR and B register as
     * a three byte generic pointer is used. */
    ulAddress       = ( uint32_t ) pvParameters;
    *pxTopOfStack   = ( StackType_t ) ulAddress; /* DPL */
    ulAddress     >>= 8;
    *pxTopOfStack++;
    *pxTopOfStack   = ( StackType_t ) ulAddress; /* DPH */
    ulAddress     >>= 8;
    pxTopOfStack++;
    *pxTopOfStack   = ( StackType_t ) ulAddress; /* b */
    pxTopOfStack++;

    /* The remaining registers are straight forward. */
    *pxTopOfStack   = 0x02; /* R2 */
    pxTopOfStack++;
    *pxTopOfStack   = 0x03; /* R3 */
    pxTopOfStack++;
    *pxTopOfStack   = 0x04; /* R4 */
    pxTopOfStack++;
    *pxTopOfStack   = 0x05; /* R5 */
    pxTopOfStack++;
    *pxTopOfStack   = 0x06; /* R6 */
    pxTopOfStack++;
    *pxTopOfStack   = 0x07; /* R7 */
    pxTopOfStack++;
    *pxTopOfStack   = 0x00; /* R0 */
    pxTopOfStack++;
    *pxTopOfStack   = 0x01; /* R1 */
    pxTopOfStack++;
    *pxTopOfStack   = 0x00; /* PSW */
    pxTopOfStack++;
    *pxTopOfStack   = 0xbb; /* BP */

    /* Dont increment the stack size here as we don't want to include
     * the stack size byte as part of the stack size count.
     *
     * Finally we place the stack size at the beginning. */
    *pxStartOfStack = ( StackType_t ) ( pxTopOfStack - pxStartOfStack );

    /* Unlike most ports, we return the start of the stack as this is where the
     * size of the stack is stored. */
    return pxStartOfStack;
}
/*-----------------------------------------------------------*/

/*
 * See header file for description.
 */
BaseType_t xPortStartScheduler( void )
{
    /* Setup timer 2 to generate the RTOS tick. */
    prvSetupTimerInterrupt();

    /* Make sure we start with the expected SFR page.  This line should not
     * really be required. */
    SFRPAGE = 0;

    /* Copy the stack for the first task to execute from XRAM into the stack,
     * restore the task context from the new stack, then start running the task. */
    portCOPY_XRAM_TO_STACK();
    portRESTORE_CONTEXT();

    /* Should never get here! */
    return pdTRUE;
}
/*-----------------------------------------------------------*/

void vPortEndScheduler( void )
{
    /* Not implemented for this port. */
}
/*-----------------------------------------------------------*/

/*
 * Manual context switch.  The first thing we do is save the registers so we
 * can use a naked attribute.
 */
void vPortYield( void ) _naked
{
    /* Save the execution context onto the stack, then copy the entire stack
     * to XRAM.  This is necessary as the internal RAM is only large enough to
     * hold one stack, and we want one per task.
     *
     * PERFORMANCE COULD BE IMPROVED BY ONLY COPYING TO XRAM IF A TASK SWITCH
     * IS REQUIRED. */
    portSAVE_CONTEXT();
    portCOPY_STACK_TO_XRAM();

    /* Call the standard scheduler context switch function. */
    vTaskSwitchContext();

    /* Copy the stack of the task about to execute from XRAM into RAM and
     * restore it's context ready to run on exiting. */
    portCOPY_XRAM_TO_STACK();
    portRESTORE_CONTEXT();
}
/*-----------------------------------------------------------*/

#if configUSE_PREEMPTION == 1
    void vTimer2ISR( void ) interrupt 5 _naked
    {
        /* Preemptive context switch function triggered by the timer 2 ISR.
         * This does the same as vPortYield() (see above) with the addition
         * of incrementing the RTOS tick count. */

        portSAVE_CONTEXT();
        portCOPY_STACK_TO_XRAM();

        if( xTaskIncrementTick() != pdFALSE )
        {
            vTaskSwitchContext();
        }

        portCLEAR_INTERRUPT_FLAG();
        portCOPY_XRAM_TO_STACK();
        portRESTORE_CONTEXT();
    }
#else  /* if configUSE_PREEMPTION == 1 */
    void vTimer2ISR( void ) interrupt 5
    {
        /* When using the cooperative scheduler the timer 2 ISR is only
         * required to increment the RTOS tick count. */

        xTaskIncrementTick();
        portCLEAR_INTERRUPT_FLAG();
    }
#endif /* if configUSE_PREEMPTION == 1 */
/*-----------------------------------------------------------*/

static void prvSetupTimerInterrupt( void )
{
    uint8_t        ucOriginalSFRPage;

/* Constants calculated to give the required timer capture values. */
    const uint32_t ulTicksPerSecond  = configCPU_CLOCK_HZ / portCLOCK_DIVISOR;
    const uint32_t ulCaptureTime     = ulTicksPerSecond / configTICK_RATE_HZ;
    const uint32_t ulCaptureValue    = portMAX_TIMER_VALUE - ulCaptureTime;
    const uint8_t  ucLowCaptureByte  = ( uint8_t ) ( ulCaptureValue & ( uint32_t ) 0xff );
    const uint8_t  ucHighCaptureByte = ( uint8_t ) ( ulCaptureValue >> ( uint32_t ) 8 );

    /* NOTE:  This uses a timer only present on 8052 architecture. */

    /* Remember the current SFR page so we can restore it at the end of the
     * function. */
    ucOriginalSFRPage = SFRPAGE;
    SFRPAGE           = 0;

    /* TMR2CF can be left in its default state. */
    TMR2CF            = ( uint8_t ) 0;

    /* Setup the overflow reload value. */
    RCAP2L            = ucLowCaptureByte;
    RCAP2H            = ucHighCaptureByte;

    /* The initial load is performed manually. */
    TMR2L             = ucLowCaptureByte;
    TMR2H             = ucHighCaptureByte;

    /* Enable the timer 2 interrupts. */
    IE               |= portTIMER_2_INTERRUPT_ENABLE;

    /* Interrupts are disabled when this is called so the timer can be started
     * here. */
    TMR2CN            = portENABLE_TIMER;

    /* Restore the original SFR page. */
    SFRPAGE           = ucOriginalSFRPage;
}
