/*
 * 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
 *
 */

/* Standard includes. */
#include <stdlib.h>

/* Scheduler includes. */
#include "FreeRTOS.h"
#include "task.h"

/* Critical nesting should be initialised to a non zero value so interrupts don't
accidentally get enabled before the scheduler is started. */
#define portINITIAL_CRITICAL_NESTING  (( StackType_t ) 10)

/* The PSW value assigned to tasks when they start to run for the first time. */
#define portPSW       (( StackType_t ) 0x00000000)

/* 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;

/* Keeps track of the nesting level of critical sections. */
volatile StackType_t usCriticalNesting = portINITIAL_CRITICAL_NESTING;
/*-----------------------------------------------------------*/

/* Sets up the timer to generate the tick interrupt. */
static void prvSetupTimerInterrupt( void );

/*-----------------------------------------------------------*/
StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
{
    *pxTopOfStack = ( StackType_t ) pxCode;          /* Task function start address */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) pxCode;          /* Task function start address */
    pxTopOfStack--;
    *pxTopOfStack = portPSW;                            /* Initial PSW value */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x20202020;      /* Initial Value of R20 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x21212121;      /* Initial Value of R21 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x22222222;      /* Initial Value of R22 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x23232323;      /* Initial Value of R23 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x24242424;      /* Initial Value of R24 */
    pxTopOfStack--;
#if (__DATA_MODEL__ == 0) || (__DATA_MODEL__ == 1)
    *pxTopOfStack = ( StackType_t ) 0x25252525;      /* Initial Value of R25 */
    pxTopOfStack--;
#endif /* configDATA_MODE */
    *pxTopOfStack = ( StackType_t ) 0x26262626;      /* Initial Value of R26 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x27272727;      /* Initial Value of R27 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x28282828;      /* Initial Value of R28 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x29292929;      /* Initial Value of R29 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x30303030;      /* Initial Value of R30 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x19191919;      /* Initial Value of R19 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x18181818;      /* Initial Value of R18 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x17171717;      /* Initial Value of R17 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x16161616;      /* Initial Value of R16 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x15151515;      /* Initial Value of R15 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x14141414;      /* Initial Value of R14 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x13131313;      /* Initial Value of R13 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x12121212;      /* Initial Value of R12 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x11111111;      /* Initial Value of R11 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x10101010;      /* Initial Value of R10 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x99999999;      /* Initial Value of R09 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x88888888;      /* Initial Value of R08 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x77777777;      /* Initial Value of R07 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x66666666;      /* Initial Value of R06 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x55555555;      /* Initial Value of R05 */
    pxTopOfStack--;
#if __DATA_MODEL__ == 0 || __DATA_MODEL__ == 1
    *pxTopOfStack = ( StackType_t ) 0x44444444;      /* Initial Value of R04 */
    pxTopOfStack--;
#endif /* configDATA_MODE */
    *pxTopOfStack = ( StackType_t ) 0x22222222;      /* Initial Value of R02 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) pvParameters;    /* R1 is expected to hold the function parameter*/
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING;

    /*
     * Return a pointer to the top of the stack we have generated so this can
     * be stored in the task control block for the task.
     */
    return pxTopOfStack;
}
/*-----------------------------------------------------------*/

BaseType_t xPortStartScheduler( void )
{
    /* Setup the hardware to generate the tick.  Interrupts are disabled when
    this function is called. */
    prvSetupTimerInterrupt();

    /* Restore the context of the first task that is going to run. */
    vPortStart();

    /* Should not get here as the tasks are now running! */
    return pdTRUE;
}
/*-----------------------------------------------------------*/

void vPortEndScheduler( void )
{
    /* It is unlikely that the V850ES/Fx3 port will get stopped.  If required simply
    disable the tick interrupt here. */
}
/*-----------------------------------------------------------*/

/*
 * Hardware initialisation to generate the RTOS tick.  This uses
 */
static void prvSetupTimerInterrupt( void )
{
    TM0CE     = 0;  /* TMM0 operation disable */
    TM0EQMK0  = 1;  /* INTTM0EQ0 interrupt disable */
    TM0EQIF0  = 0;  /* clear INTTM0EQ0 interrupt flag */

    #ifdef __IAR_V850ES_Fx3__
    {
        TM0CMP0   = (((configCPU_CLOCK_HZ / configTICK_RATE_HZ) / 2)-1);    /* divided by 2 because peripherals only run at CPU_CLOCK/2 */
    }
    #else
    {
        TM0CMP0   = (configCPU_CLOCK_HZ / configTICK_RATE_HZ);
    }
    #endif

    TM0EQIC0 &= 0xF8;
    TM0CTL0   = 0x00;
    TM0EQIF0 =  0;  /* clear INTTM0EQ0 interrupt flag */
    TM0EQMK0 =  0;  /* INTTM0EQ0 interrupt enable */
    TM0CE =     1;  /* TMM0 operation enable */
}
/*-----------------------------------------------------------*/
