/*
 * 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
 *
 */

/*
 * Changes from V3.0.0
 + ISRcode is pulled inline and portTICKisr() is therefore
 +    deleted from this file.
 +
 + Prescaler logic for Timer1 added to allow for a wider
 +    range of TickRates.
 +
 + Changes from V3.0.1
 */

#include <FreeRTOS.h>
#include <task.h>

/* IO port constants. */
#define portBIT_SET                    ( 1 )
#define portBIT_CLEAR                  ( 0 )

/*
 * Hardware setup for the tick.
 * We use a compare match on timer1. Depending on MPU-frequency
 * and requested tickrate, a prescaled value with a matching
 * prescaler are determined.
 */
#define portTIMER_COMPARE_BASE         ( ( APROCFREQ / 4 ) / configTICK_RATE_HZ )

#if portTIMER_COMPARE_BASE < 0x10000
    #define portTIMER_COMPARE_VALUE    ( portTIMER_COMPARE_BASE )
    #define portTIMER_COMPARE_PS1      ( portBIT_CLEAR )
    #define portTIMER_COMPARE_PS0      ( portBIT_CLEAR )
#elif portTIMER_COMPARE_BASE < 0x20000
    #define portTIMER_COMPARE_VALUE    ( portTIMER_COMPARE_BASE / 2 )
    #define portTIMER_COMPARE_PS1      ( portBIT_CLEAR )
    #define portTIMER_COMPARE_PS0      ( portBIT_SET )
#elif portTIMER_COMPARE_BASE < 0x40000
    #define portTIMER_COMPARE_VALUE    ( portTIMER_COMPARE_BASE / 4 )
    #define portTIMER_COMPARE_PS1      ( portBIT_SET )
    #define portTIMER_COMPARE_PS0      ( portBIT_CLEAR )
#elif portTIMER_COMPARE_BASE < 0x80000
    #define portTIMER_COMPARE_VALUE    ( portTIMER_COMPARE_BASE / 8 )
    #define portTIMER_COMPARE_PS1      ( portBIT_SET )
    #define portTIMER_COMPARE_PS0      ( portBIT_SET )
#else /* if portTIMER_COMPARE_BASE < 0x10000 */
    #error "TickRate out of range"
#endif /* if portTIMER_COMPARE_BASE < 0x10000 */

/*-----------------------------------------------------------*/

/*
 * Setup a timer for a regular tick.
 */
void portSetupTick( void )
{
    /*
     * Interrupts are disabled when this function is called.
     */

    /*
     * Setup CCP1
     * Provide the tick interrupt using a compare match on timer1.
     */

    /*
     * Set the compare match value.
     */
    CCPR1H   = ( uint8_t ) ( ( portTIMER_COMPARE_VALUE >> 8 ) & 0xff );
    CCPR1L   = ( uint8_t ) ( portTIMER_COMPARE_VALUE & 0xff );

    /*
     * Set Compare Special Event Trigger Mode
     */
    bCCP1M3  = portBIT_SET;
    bCCP1M2  = portBIT_CLEAR;
    bCCP1M1  = portBIT_SET;
    bCCP1M0  = portBIT_SET;

    /*
     * Enable CCP1 interrupt
     */
    bCCP1IE  = portBIT_SET;

    /*
     * We are only going to use the global interrupt bit, so disable
     * interruptpriorities and enable peripheral interrupts.
     */
    bIPEN    = portBIT_CLEAR;
    bPEIE    = portBIT_SET;

    /*
     * Set up timer1
     * It will produce the system tick.
     */

    /*
     * Clear the time count
     */
    TMR1H    = ( uint8_t ) 0x00;
    TMR1L    = ( uint8_t ) 0x00;

    /*
     * Setup the timer
     */
    bRD16    = portBIT_SET;           /* 16-bit */
    bT1CKPS1 = portTIMER_COMPARE_PS1; /* prescaler */
    bT1CKPS0 = portTIMER_COMPARE_PS0; /* prescaler */
    bT1OSCEN = portBIT_SET;           /* Oscillator enable */
    bT1SYNC  = portBIT_SET;           /* No external clock sync */
    bTMR1CS  = portBIT_CLEAR;         /* Internal clock */

    bTMR1ON  = portBIT_SET;           /* Start timer1 */
}
