/*
 * 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
 *
 * 1 tab == 4 spaces!
 */

/*
 * 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 */
}
