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

/*
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
    #error "TickRate out of range"
#endif

/*-----------------------------------------------------------*/

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