/*
 * 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
 *
 * 1 tab == 4 spaces!
 */

/*
 * Changes from V3.2.1
 + CallReturn Depth increased from 8 to 10 levels to accomodate wizC/fedC V12.
 +
 + Changes from V3.2.0
 + TBLPTRU is now initialised to zero during the initial stack creation of a new task. This solves
 +  an error on devices with more than 64kB ROM.
 +
 + Changes from V3.0.0
 + ucCriticalNesting is now initialised to 0x7F to prevent interrupts from being
 +        handled before the scheduler is started.
 +
 + Changes from V3.0.1
 */

/* Scheduler include files. */
#include <FreeRTOS.h>
#include <task.h>

#include <malloc.h>

/*---------------------------------------------------------------------------
 * Implementation of functions defined in portable.h for the WizC PIC18 port.
 *---------------------------------------------------------------------------*/

/*
 * 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;

/*
 * Define minimal-stack constants
 * -----
 * FSR's:
 *		STATUS, WREG, BSR, PRODH, PRODL, FSR0H, FSR0L,
 *		FSR1H, FSR1L,TABLAT, (TBLPTRU), TBLPTRH, TBLPTRL,
 *		(PCLATU), PCLATH
 *		sfr's within parenthesis only on devices > 64kB
 * -----
 * Call/Return stack:
 *		 2 bytes per entry on devices <= 64kB
 *		 3 bytes per entry on devices >  64kB
 * -----
 * Other bytes:
 *		 2 bytes: FunctionParameter for initial taskcode
 *		 1 byte : Number of entries on call/return stack
 *		 1 byte : ucCriticalNesting
 *		16 bytes: Free space on stack
 */
#if _ROMSIZE > 0x8000
    #define portSTACK_FSR_BYTES                ( 15 )
    #define portSTACK_CALLRETURN_ENTRY_SIZE    ( 3 )
#else
    #define portSTACK_FSR_BYTES                ( 13 )
    #define portSTACK_CALLRETURN_ENTRY_SIZE    ( 2 )
#endif

#define portSTACK_MINIMAL_CALLRETURN_DEPTH     ( 10 )
#define portSTACK_OTHER_BYTES                  ( 20 )

uint16_t usCalcMinStackSize = 0;

/*-----------------------------------------------------------*/

/*
 * We initialise ucCriticalNesting to the middle value an
 * uint8_t can contain. This way portENTER_CRITICAL()
 * and portEXIT_CRITICAL() can be called without interrupts
 * being enabled before the scheduler starts.
 */
register uint8_t ucCriticalNesting = 0x7F;

/*-----------------------------------------------------------*/

/*
 * Initialise the stack of a new task.
 * See portSAVE_CONTEXT macro for description.
 */
StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
                                     TaskFunction_t pxCode,
                                     void * pvParameters )
{
    uint8_t ucScratch;

    /*
     * Get the size of the RAMarea in page 0 used by the compiler
     * We do this here already to avoid W-register conflicts.
     */
    _Pragma( "asm" )
    movlw OVERHEADPAGE0 - LOCOPTSIZE + MAXLOCOPTSIZE
    movwf PRODL, ACCESS;
    PRODL is used as temp register _Pragma( "asmend" )
    ucScratch = PRODL;

    /*
     * Place a few bytes of known values on the bottom of the stack.
     * This is just useful for debugging.
     */
/*	*pxTopOfStack--	= 0x11; */
/*	*pxTopOfStack-- = 0x22; */
/*	*pxTopOfStack-- = 0x33; */

    /*
     * Simulate how the stack would look after a call to vPortYield()
     * generated by the compiler.
     */

    /*
     * First store the function parameters.  This is where the task expects
     * to find them when it starts running.
     */
    *pxTopOfStack-- = ( StackType_t ) ( ( ( uint16_t ) pvParameters >> 8 ) & 0x00ff );
    *pxTopOfStack-- = ( StackType_t ) ( ( uint16_t ) pvParameters & 0x00ff );

    /*
     * Next are all the registers that form part of the task context.
     */
    *pxTopOfStack-- = ( StackType_t ) 0x11;     /* STATUS. */
    *pxTopOfStack-- = ( StackType_t ) 0x22;     /* WREG. */
    *pxTopOfStack-- = ( StackType_t ) 0x33;     /* BSR. */
    *pxTopOfStack-- = ( StackType_t ) 0x44;     /* PRODH. */
    *pxTopOfStack-- = ( StackType_t ) 0x55;     /* PRODL. */
    *pxTopOfStack-- = ( StackType_t ) 0x66;     /* FSR0H. */
    *pxTopOfStack-- = ( StackType_t ) 0x77;     /* FSR0L. */
    *pxTopOfStack-- = ( StackType_t ) 0x88;     /* FSR1H. */
    *pxTopOfStack-- = ( StackType_t ) 0x99;     /* FSR1L. */
    *pxTopOfStack-- = ( StackType_t ) 0xAA;     /* TABLAT. */
    #if _ROMSIZE > 0x8000
        *pxTopOfStack-- = ( StackType_t ) 0x00; /* TBLPTRU. */
    #endif
    *pxTopOfStack-- = ( StackType_t ) 0xCC;     /* TBLPTRH. */
    *pxTopOfStack-- = ( StackType_t ) 0xDD;     /* TBLPTRL. */
    #if _ROMSIZE > 0x8000
        *pxTopOfStack-- = ( StackType_t ) 0xEE; /* PCLATU. */
    #endif
    *pxTopOfStack-- = ( StackType_t ) 0xFF;     /* PCLATH. */

    /*
     * Next the compiler's scratchspace.
     */
    while( ucScratch-- > 0 )
    {
        *pxTopOfStack-- = ( StackType_t ) 0;
    }

    /*
     * The only function return address so far is the address of the task entry.
     * The order is TOSU/TOSH/TOSL. For devices > 64kB, TOSU is put on the
     * stack, too. TOSU is always written as zero here because wizC does not allow
     * functionpointers to point above 64kB in ROM.
     */
    #if _ROMSIZE > 0x8000
        *pxTopOfStack-- = ( StackType_t ) 0;
    #endif
    *pxTopOfStack-- = ( StackType_t ) ( ( ( uint16_t ) pxCode >> 8 ) & 0x00ff );
    *pxTopOfStack-- = ( StackType_t ) ( ( uint16_t ) pxCode & 0x00ff );

    /*
     * Store the number of return addresses on the hardware stack.
     * So far only the address of the task entry point.
     */
    *pxTopOfStack-- = ( StackType_t ) 1;

    /*
     * The code generated by wizC does not maintain separate
     * stack and frame pointers. Therefore the portENTER_CRITICAL macro cannot
     * use the stack as per other ports.  Instead a variable is used to keep
     * track of the critical section nesting.  This variable has to be stored
     * as part of the task context and is initially set to zero.
     */
    *pxTopOfStack-- = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING;

    return pxTopOfStack;
}
/*-----------------------------------------------------------*/

uint16_t usPortCALCULATE_MINIMAL_STACK_SIZE( void )
{
    /*
     * Fetch the size of compiler's scratchspace.
     */
    _Pragma( "asm" )
    movlw OVERHEADPAGE0 - LOCOPTSIZE + MAXLOCOPTSIZE
    movlb usCalcMinStackSize >> 8
    movwf usCalcMinStackSize, BANKED _Pragma( "asmend" )

    /*
     * Add minimum needed stackspace
     */
    usCalcMinStackSize += ( portSTACK_FSR_BYTES )
                          + ( portSTACK_MINIMAL_CALLRETURN_DEPTH * portSTACK_CALLRETURN_ENTRY_SIZE )
                          + ( portSTACK_OTHER_BYTES );

    return( usCalcMinStackSize );
}

/*-----------------------------------------------------------*/

BaseType_t xPortStartScheduler( void )
{
    extern void portSetupTick( void );

    /*
     * Setup a timer for the tick ISR for the preemptive scheduler.
     */
    portSetupTick();

    /*
     * Restore the context of the first task to run.
     */
    portRESTORE_CONTEXT();

    /*
     * This point should never be reached during execution.
     */
    return pdTRUE;
}

/*-----------------------------------------------------------*/

void vPortEndScheduler( void )
{
    /*
     * It is unlikely that the scheduler for the PIC port will get stopped
     * once running. When called a reset is done which is probably the
     * most valid action.
     */
    _Pragma( asmline reset );
}

/*-----------------------------------------------------------*/

/*
 * Manual context switch.  This is similar to the tick context switch,
 * but does not increment the tick count.  It must be identical to the
 * tick context switch in how it stores the stack of a task.
 */
void vPortYield( void )
{
    /*
     * Save the context of the current task.
     */
    portSAVE_CONTEXT( portINTERRUPTS_UNCHANGED );

    /*
     * Switch to the highest priority task that is ready to run.
     */
    vTaskSwitchContext();

    /*
     * Start executing the task we have just switched to.
     */
    portRESTORE_CONTEXT();
}
/*-----------------------------------------------------------*/

#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )

    void * pvPortMalloc( uint16_t usWantedSize )
    {
        void * pvReturn;

        vTaskSuspendAll();
        {
            pvReturn = malloc( ( malloc_t ) usWantedSize );
        }
        xTaskResumeAll();

        return pvReturn;
    }

#endif /* configSUPPORT_STATIC_ALLOCATION */

/*-----------------------------------------------------------*/

#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )

    void vPortFree( void * pv )
    {
        if( pv )
        {
            vTaskSuspendAll();
            {
                free( pv );
            }
            xTaskResumeAll();
        }
    }

#endif /* configSUPPORT_DYNAMIC_ALLOCATION */
