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