/*
 * FreeRTOS Kernel <DEVELOPMENT BRANCH>
 * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
 *
 * SPDX-License-Identifier: MIT
 *
 * 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.
 *
 * https://www.FreeRTOS.org
 * https://github.com/FreeRTOS
 *
 */

/*
Changes from V3.2.1
    + CallReturn Depth increased from 8 to 10 levels to accommodate 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 */
