/*
 *  FreeRTOS V4.1.1 - Copyright (C) 2003-2006 Richard Barry.
 *  MCF5235 Port - Copyright (C) 2006 Christian Walter.
 *
 *  This file is part of the FreeRTOS distribution.
 *
 *  FreeRTOS is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License** as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  FreeRTOS is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with FreeRTOS; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  A special exception to the GPL can be applied should you wish to distribute
 *  a combined work that includes FreeRTOS, without being obliged to provide
 *  the source code for any proprietary components.  See the licensing section
 *  of http://www.FreeRTOS.org for full details of how and when the exception
 *  can be applied.
 *
 ***************************************************************************
 ***************************************************************************
 *                                                                         *
 * Get the FreeRTOS eBook!  See http://www.FreeRTOS.org/Documentation      *
 *                                                                         *
 * This is a concise, step by step, 'hands on' guide that describes both   *
 * general multitasking concepts and FreeRTOS specifics. It presents and   *
 * explains numerous examples that are written using the FreeRTOS API.     *
 * Full source code for all the examples is provided in an accompanying    *
 * .zip file.                                                              *
 *                                                                         *
 ***************************************************************************
 ***************************************************************************
 *
 *  Please ensure to read the configuration and relevant port sections of the
 *  online documentation.
 *
 *  http://www.FreeRTOS.org - Documentation, latest information, license and
 *  contact details.
 *
 *  http://www.SafeRTOS.com - A version that is certified for use in safety
 *  critical systems.
 *
 *  http://www.OpenRTOS.com - Commercial support, development, porting,
 *  licensing and training services.
 */

#include <stdlib.h>

#include "FreeRTOS.h"
#include "FreeRTOSConfig.h"
#include "task.h"

/* ------------------------ Types ----------------------------------------- */
typedef volatile uint32_t   vuint32;
typedef volatile uint16_t   vuint16;
typedef volatile uint8_t    vuint8;

/* ------------------------ Defines --------------------------------------- */
#define portVECTOR_TABLE             __RAMVEC
#define portVECTOR_SYSCALL           ( 32 + portTRAP_YIELD )
#define portVECTOR_TIMER             ( 64 + 36 )

#define MCF_PIT_PRESCALER            512UL
#define MCF_PIT_TIMER_TICKS          ( FSYS_2 / MCF_PIT_PRESCALER )
#define MCF_PIT_MODULUS_REGISTER( freq )    ( MCF_PIT_TIMER_TICKS / ( freq ) - 1UL )

#define MCF_PIT_PMR0                 ( *( vuint16 * ) ( void * ) ( &__IPSBAR[ 0x150002 ] ) )
#define MCF_PIT_PCSR0                ( *( vuint16 * ) ( void * ) ( &__IPSBAR[ 0x150000 ] ) )
#define MCF_PIT_PCSR_PRE( x )    ( ( ( x ) & 0x000F ) << 8 )
#define MCF_PIT_PCSR_EN              ( 0x0001 )
#define MCF_PIT_PCSR_RLD             ( 0x0002 )
#define MCF_PIT_PCSR_PIF             ( 0x0004 )
#define MCF_PIT_PCSR_PIE             ( 0x0008 )
#define MCF_PIT_PCSR_OVW             ( 0x0010 )
#define MCF_INTC0_ICR36              ( *( vuint8 * ) ( void * ) ( &__IPSBAR[ 0x000C64 ] ) )
#define MCF_INTC0_IMRH               ( *( vuint32 * ) ( void * ) ( &__IPSBAR[ 0x000C08 ] ) )
#define MCF_INTC0_IMRH_INT_MASK36    ( 0x00000010 )
#define MCF_INTC0_IMRH_MASKALL       ( 0x00000001 )
#define MCF_INTC0_ICRn_IP( x )    ( ( ( x ) & 0x07 ) << 0 )
#define MCF_INTC0_ICRn_IL( x )    ( ( ( x ) & 0x07 ) << 3 )

#define portNO_CRITICAL_NESTING         ( ( uint32_t ) 0 )
#define portINITIAL_CRITICAL_NESTING    ( ( uint32_t ) 10 )

/* ------------------------ Static variables ------------------------------ */
volatile uint32_t ulCriticalNesting = portINITIAL_CRITICAL_NESTING;

/* ------------------------ Static functions ------------------------------ */
#if configUSE_PREEMPTION == 0
    static void prvPortPreemptiveTick( void ) __attribute__( ( interrupt_handler ) );
#else
    static void prvPortPreemptiveTick( void );
#endif

/* ------------------------ Start implementation -------------------------- */

StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
                                     TaskFunction_t pxCode,
                                     void * pvParameters )
{
    /* Place the parameter on the stack in the expected location. */
    *pxTopOfStack = ( StackType_t ) pvParameters;
    pxTopOfStack--;

    /* Place dummy return address on stack. Tasks should never terminate so
     * we can set this to anything. */
    *pxTopOfStack = ( StackType_t ) 0;
    pxTopOfStack--;

    /* Create a Motorola Coldfire exception stack frame. First comes the return
     * address. */
    *pxTopOfStack = ( StackType_t ) pxCode;
    pxTopOfStack--;

    /* Format, fault-status, vector number for exception stack frame. Task
     * run in supervisor mode. */
    *pxTopOfStack = 0x40002000UL | ( portVECTOR_SYSCALL + 32 ) << 18;
    pxTopOfStack--;

    /* Set the initial critical section nesting counter to zero. This value
     * is used to restore the value of ulCriticalNesting. */
    *pxTopOfStack = 0;
    *pxTopOfStack--;

    *pxTopOfStack = ( StackType_t ) 0xA6; /* A6 / FP */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0xA5; /* A5 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0xA4; /* A4 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0xA3; /* A3 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0xA2; /* A2 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0xA1; /* A1 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0xA0; /* A0 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0xD7; /* D7 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0xD6; /* D6 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0xD5; /* D5 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0xD4; /* D4 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0xD3; /* D3 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0xD2; /* D2 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0xD1; /* D1 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0xD0; /* D0 */

    return pxTopOfStack;
}

/*
 * Called by portYIELD() or taskYIELD() to manually force a context switch.
 */
static void prvPortYield( void )
{
    asm volatile ( "move.w  #0x2700, %sr\n\t" );
    #if _GCC_USES_FP == 1
        asm volatile ( "unlk %fp\n\t" );
    #endif
    /* Perform the context switch.  First save the context of the current task. */
    portSAVE_CONTEXT();

    /* Find the highest priority task that is ready to run. */
    vTaskSwitchContext();

    /* Restore the context of the new task. */
    portRESTORE_CONTEXT();
}

#if configUSE_PREEMPTION == 0

/*
 * The ISR used for the scheduler tick depends on whether the cooperative or
 * the preemptive scheduler is being used.
 */
    static void prvPortPreemptiveTick( void )
    {
        /* The cooperative scheduler requires a normal IRQ service routine to
         * simply increment the system tick.
         */

        xTaskIncrementTick();
        MCF_PIT_PCSR0 |= MCF_PIT_PCSR_PIF;
    }

#else /* if configUSE_PREEMPTION == 0 */

    static void prvPortPreemptiveTick( void )
    {
        asm volatile ( "move.w  #0x2700, %sr\n\t" );
        #if _GCC_USES_FP == 1
            asm volatile ( "unlk %fp\n\t" );
        #endif
        portSAVE_CONTEXT();
        MCF_PIT_PCSR0 |= MCF_PIT_PCSR_PIF;

        if( xTaskIncrementTick() != pdFALSE )
        {
            vTaskSwitchContext();
        }

        portRESTORE_CONTEXT();
    }
#endif /* if configUSE_PREEMPTION == 0 */

void vPortEnterCritical()
{
    /* FIXME: We should store the old IPL here - How are we supposed to do
     * this.
     */
    ( void ) portSET_IPL( portIPL_MAX );

    /* Now interrupts are disabled ulCriticalNesting can be accessed
     * directly.  Increment ulCriticalNesting to keep a count of how many times
     * portENTER_CRITICAL() has been called. */
    ulCriticalNesting++;
}

void vPortExitCritical()
{
    if( ulCriticalNesting > portNO_CRITICAL_NESTING )
    {
        /* Decrement the nesting count as we are leaving a critical section. */
        ulCriticalNesting--;

        /* If the nesting level has reached zero then interrupts should be
         * re-enabled. */
        if( ulCriticalNesting == portNO_CRITICAL_NESTING )
        {
            ( void ) portSET_IPL( 0 );
        }
    }
}

BaseType_t xPortStartScheduler( void )
{
    extern void ( * portVECTOR_TABLE[] ) ();

    /* Add entry in vector table for yield system call. */
    portVECTOR_TABLE[ portVECTOR_SYSCALL ] = prvPortYield;
    /* Add entry in vector table for periodic timer. */
    portVECTOR_TABLE[ portVECTOR_TIMER ] = prvPortPreemptiveTick;

    /* Configure the timer for the system clock. */
    if( configTICK_RATE_HZ > 0 )
    {
        /* Configure prescaler */
        MCF_PIT_PCSR0 = MCF_PIT_PCSR_PRE( 0x9 ) | MCF_PIT_PCSR_RLD | MCF_PIT_PCSR_OVW;
        /* Initialize the periodic timer interrupt. */
        MCF_PIT_PMR0 = MCF_PIT_MODULUS_REGISTER( configTICK_RATE_HZ );
        /* Configure interrupt priority and level and unmask interrupt. */
        MCF_INTC0_ICR36 = MCF_INTC0_ICRn_IL( 0x1 ) | MCF_INTC0_ICRn_IP( 0x1 );
        MCF_INTC0_IMRH &= ~( MCF_INTC0_IMRH_INT_MASK36 | MCF_INTC0_IMRH_MASKALL );
        /* Enable interrupts */
        MCF_PIT_PCSR0 |= MCF_PIT_PCSR_PIE | MCF_PIT_PCSR_EN | MCF_PIT_PCSR_PIF;
    }

    /* Restore the context of the first task that is going to run. */
    portRESTORE_CONTEXT();

    /* Should not get here. */
    return pdTRUE;
}

void vPortEndScheduler( void )
{
}
