blob: 2c1588ca8e1e0b4274f3aaad6f744eb9da4600b7 [file] [log] [blame]
/*****************************************************************************
* © 2014 Microchip Technology Inc. and its subsidiaries.
* You may use this software and any derivatives exclusively with
* Microchip products.
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS".
* NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
* AND FITNESS FOR A PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP
* PRODUCTS, COMBINATION WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION.
* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS
* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE.
* TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL
* CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF
* FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
* MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE
* OF THESE TERMS.
*****************************************************************************/
/** @file mec14xx_jtvic.c
*MEC14xx JTVIC
*/
/** @defgroup MEC14xx Peripherals JTVIC
* @{
*/
#include "appcfg.h"
#include "platform.h"
#include "MEC14xx/mec14xx.h"
#include "MEC14xx/mec14xx_jtvic.h"
void jtvic_init(const JTVIC_CFG *ih_table, uint32_t disagg_bitmap, uint32_t cflags)
{
uint32_t d;
uint8_t i, j, pidx;
JTVIC_CTRL->w = (1ul << 0); // Soft-Reset
d = 0ul;
if ( cflags & (1ul << 0) )
{
d = (1ul << 8);
}
JTVIC_CTRL->w = d; // HW does not automatically clear Soft-Reset
for (i = 0u; i < (MEC14xx_NUM_JTVIC_INTS); i++) {
pidx = i << 2;
for (j = 0u; j < 4u; j++) {
JTVIC_PRI->REG32[pidx+j] = (uint32_t)(ih_table[i].pri[j]);
}
d = ih_table[i].isr_addr & ~(1ul << 0);
if (disagg_bitmap & (1ul << i)) {
d |= (1ul << 0); // dis-aggregate this GIRQ
}
JTVIC_ACTRL->REG32[i] = d;
}
JTVIC_GROUP_EN_SET->w = 0xFFFFFFFFul; // Enable GIRQ08 - GIRQ18 (all)
}
/* Clear JTVIC GIRQn source bit
*
*/
void jtvic_clr_source(uint8_t girq_num, uint8_t bit_num)
{
if (girq_num < (MEC14xx_NUM_JTVIC_INTS))
{
bit_num &= 0x1Fu;
JTVIC_GIRQ->REGS[girq_num].SOURCE = (1ul << bit_num);
}
}
/* Disable GIRQn source with optional clearing of source.
* girq_num = [0, 18], 0=GIRQ08, 1=GIRQ09, ..., 18=GIRQ26
* bit_num = [0, 31]
*/
void jtvic_dis_clr_source(uint8_t girq_num, uint8_t bit_num, uint8_t clr_src)
{
if (girq_num < (MEC14xx_NUM_JTVIC_INTS))
{
bit_num &= 0x1Fu;
JTVIC_GIRQ->REGS[girq_num].EN_CLR = (1ul << bit_num);
if ( 0 != clr_src )
{
JTVIC_GIRQ->REGS[girq_num].SOURCE = (1ul << bit_num);
}
}
}
/* Enable with optional source clear before enable.
* girq_num = [0, 18], 0=GIRQ08, 1=GIRQ09, ..., 18=GIRQ26
* bit_num = [0, 31]
*/
void jtvic_en_source(uint8_t girq_num, uint8_t bit_num, uint8_t clr_src)
{
if (girq_num < (MEC14xx_NUM_JTVIC_INTS))
{
bit_num &= 0x1Fu;
if ( 0 != clr_src )
{
JTVIC_GIRQ->REGS[girq_num].SOURCE = (1ul << bit_num);
}
JTVIC_GIRQ->REGS[girq_num].EN_SET = (1ul << bit_num);
}
}
/* end mec14xx_jtvic.c */
/** @}
*/