blob: bdb77f584ae6aecae94ffc274666a67e97ac3dfc [file] [log] [blame]
/*****************************************************************************
* © 2015 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.
******************************************************************************
Version Control Information (Perforce)
******************************************************************************
$Revision: #1 $
$DateTime: 2016/09/22 08:03:49 $
$Author: pramans $
Last Change: Initial Draft
******************************************************************************/
/** @file interrupt_ecia_perphl.c
* \brief Interrupt ECIA Peripheral Source File
* \author jvasanth
*
* This file implements the ECIA peripheral functions
******************************************************************************/
/** @defgroup Interrupt
* @{
*/
#include "common_lib.h"
#include "interrupt.h"
#define ECIA ((INTS_Type *) INTS_BASE)
#define ECS ((EC_REG_BANK_Type *) EC_REG_BANK_BASE)
/* ------------------------------------------------------------------------------- */
/* Operations on GIRQ Block Enable Set, Enable Clear and Status Register */
/* ------------------------------------------------------------------------------- */
/** Enable specified GIRQ in ECIA block
* @param girq_id - enum MEC_GIRQ_IDS
*/
void p_interrupt_ecia_block_enable_set(uint8_t girq_id)
{
if ( girq_id < (MEC_GIRQ_ID_MAX) ) {
ECIA->BLOCK_ENABLE_SET = (1ul << ((girq_id + 8) & 0x1Fu));
}
}
/** Enable GIRQs in ECIA Block
* @param girq_bitmask - Bitmask of GIRQs to be enabled in ECIA Block
*/
void p_interrupt_ecia_block_enable_bitmask_set(uint32_t girq_bitmask)
{
ECIA->BLOCK_ENABLE_SET = girq_bitmask;
}
/** Check if specified GIRQ block enabled or not
* @param girq_id - enum MEC_GIRQ_IDS
* @return retVal - 1 if the particular GIRQ block enabled, else 0
*/
uint8_t p_interrupt_ecia_block_enable_get(uint8_t girq_id)
{
uint8_t retVal;
retVal = 0;
if ( girq_id < (MEC_GIRQ_ID_MAX) )
{
if ((ECIA->BLOCK_ENABLE_SET) & (1ul << ((girq_id + 8) & 0x1Fu)))
{
retVal = 1;
}
}
return retVal;
}
/** Set all GIRQ block enables */
void p_interrupt_ecia_block_enable_all_set(void)
{
ECIA->BLOCK_ENABLE_SET = 0xfffffffful;
}
/** Clear specified GIRQ in ECIA Block
* @param girq_id - enum MEC_GIRQ_IDS
*/
void p_interrupt_ecia_block_enable_clr(uint8_t girq_id)
{
if ( girq_id < (MEC_GIRQ_ID_MAX) ) {
ECIA->BLOCK_ENABLE_CLEAR = (1ul << ((girq_id + 8) & 0x1Fu));
}
}
/** Clear GIRQs in ECIA Block
* @param girq_bitmask - Bitmask of GIRQs to be cleared in ECIA Block
*/
void p_interrupt_ecia_block_enable_bitmask_clr(uint32_t girq_bitmask)
{
ECIA->BLOCK_ENABLE_CLEAR = girq_bitmask;
}
/** p_interrupt_ecia_block_enable_all_clr - Clears all GIRQ block enables */
void p_interrupt_ecia_block_enable_all_clr(void)
{
ECIA->BLOCK_ENABLE_CLEAR = 0xfffffffful;
}
/** Get status of GIRQ in ECIA Block
* @param girq_id - enum MEC_GIRQ_IDS
* @return 0 if status bit not set; else non-zero value
*/
uint32_t p_interrupt_ecia_block_irq_status_get(uint8_t girq_id)
{
uint32_t retVal;
retVal = ECIA->BLOCK_IRQ_VECTOR & (1ul << ((girq_id + 8) & 0x1Fu));
return retVal;
}
/** Reads the Block IRQ Vector Register
* @return 32-bit value
*/
uint32_t p_interrupt_ecia_block_irq_all_status_get(void)
{
uint32_t retVal;
retVal = ECIA->BLOCK_IRQ_VECTOR;
return retVal;
}
/* ------------------------------------------------------------------------------- */
/* Operations on GIRQx Source, Enable, Result and Enable Registers */
/* ------------------------------------------------------------------------------- */
/** Clear specified interrupt source bit in GIRQx
* @param girq_id - enum MEC_GIRQ_IDS
* @param bitnum -[0, 31]
*/
void p_interrupt_ecia_girq_source_clr(int16_t girq_id, uint8_t bitnum)
{
__IO uint32_t *girq_source = (uint32_t*)ECIA;
if ( girq_id < (MEC_GIRQ_ID_MAX) ) {
/* Each GIRQ has 5 32bit fields: SRC, ENABLE_SET, ENABLE_CLR, RESULT & RESERVED
* please refer INTS_Type in MCHP_device_internal.h
* Based on the girq id calculate the offset in the structure INTS_Type
*
* BASED ON THE STRUCTURE DEFINITION OF INTS_Type ALL FIELDS ARE ALIGNED ON
* 32 BIT BOUNDARY, FOLLOWING WILL NOT WORK IF THIS SCHEME CHANGES
*/
girq_source += (5 * girq_id);
*girq_source |= (1ul << (bitnum & 0x1Fu));
}
}
/** Read the specified interrupt source bit in GIRQx
* @param girq_id - enum MEC_GIRQ_IDS
* @param bitnum -[0, 31]
* @return 0 if source bit not set; else non-zero value
*/
uint32_t p_interrupt_ecia_girq_source_get(int16_t girq_id, uint8_t bitnum)
{
uint32_t retVal;
__IO uint32_t *girq_source = (uint32_t*)ECIA;
retVal = 0;
if ( girq_id < (MEC_GIRQ_ID_MAX) ) {
/* Each GIRQ has 5 32bit fields: SRC, ENABLE_SET, ENABLE_CLR, RESULT & RESERVED
* please refer INTS_Type in MCHP_device_internal.h
* Based on the girq id calculate the offset in the structure INTS_Type
*
* BASED ON THE STRUCTURE DEFINITION OF INTS_Type ALL FIELDS ARE ALIGNED ON
* 32 BIT BOUNDARY, FOLLOWING WILL NOT WORK IF THIS SCHEME CHANGES
*/
girq_source += (5 * girq_id);
retVal = (*girq_source & (1ul << (bitnum & 0x1Fu)));
}
return retVal;
}
/** Enable the specified interrupt in GIRQx
* girq_id - enum MEC_GIRQ_IDS
* bitnum = [0, 31]
*/
void p_interrupt_ecia_girq_enable_set(uint16_t girq_id, uint8_t bitnum)
{
__IO uint32_t *girq_enable_set = (uint32_t*)(&(ECIA->GIRQ08_EN_SET));
if ( girq_id < (MEC_GIRQ_ID_MAX) ) {
/* Each GIRQ has 5 32bit fields: SRC, ENABLE_SET, ENABLE_CLR, RESULT & RESERVED
* please refer INTS_Type in MCHP_device_internal.h
* Based on the girq id calculate the offset in the structure INTS_Type
*
* BASED ON THE STRUCTURE DEFINITION OF INTS_Type ALL FIELDS ARE ALIGNED ON
* 32 BIT BOUNDARY, FOLLOWING WILL NOT WORK IF THIS SCHEME CHANGES
*/
girq_enable_set += (5 * girq_id);
*girq_enable_set |= (1ul << (bitnum & 0x1Fu));
}
}
/** Disable the specified interrupt in GIRQx
* girq_id - enum MEC_GIRQ_IDS
* bitnum = [0, 31]
*/
void p_interrupt_ecia_girq_enable_clr(uint16_t girq_id, uint8_t bitnum)
{
__IO uint32_t *girq_enable_clr = (uint32_t*)(&(ECIA->GIRQ08_EN_CLR));
if ( girq_id < (MEC_GIRQ_ID_MAX) ) {
/* Each GIRQ has 5 32bit fields: SRC, ENABLE_SET, ENABLE_CLR, RESULT & RESERVED
* please refer INTS_Type in MCHP_device_internal.h
* Based on the girq id calculate the offset in the structure INTS_Type
*
* BASED ON THE STRUCTURE DEFINITION OF INTS_Type ALL FIELDS ARE ALIGNED ON
* 32 BIT BOUNDARY, FOLLOWING WILL NOT WORK IF THIS SCHEME CHANGES
*/
girq_enable_clr += (5 * girq_id);
*girq_enable_clr |= (1ul << (bitnum & 0x1Fu));
}
}
/** Read the status of the specified interrupt in GIRQx
* girq_id - enum MEC_GIRQ_IDS
* bitnum = [0, 31]
* @return 0 if enable bit not set; else non-zero value
*/
uint32_t p_interrupt_ecia_girq_enable_get(uint16_t girq_id, uint8_t bitnum)
{
uint32_t retVal;
__IO uint32_t *girq_enable_set = (uint32_t*)(&(ECIA->GIRQ08_EN_SET));
retVal = 0;
if ( girq_id < (MEC_GIRQ_ID_MAX) ) {
/* Each GIRQ has 5 32bit fields: SRC, ENABLE_SET, ENABLE_CLR, RESULT & RESERVED
* please refer INTS_Type in MCHP_device_internal.h
* Based on the girq id calculate the offset in the structure INTS_Type
*
* BASED ON THE STRUCTURE DEFINITION OF INTS_Type ALL FIELDS ARE ALIGNED ON
* 32 BIT BOUNDARY, FOLLOWING WILL NOT WORK IF THIS SCHEME CHANGES
*/
girq_enable_set += (5 * girq_id);
retVal = (*girq_enable_set & (1ul << (bitnum & 0x1Fu)));
}
return retVal;
}
/** Read the result bit of the interrupt in GIRQx
* @param girq_id - enum MEC_GIRQ_IDS
* @param bitnum -[0, 31]
* @return 0 if enable bit not set; else non-zero value
*/
uint32_t p_interrupt_ecia_girq_result_get(int16_t girq_id, uint8_t bitnum)
{
uint32_t retVal;
__IO uint32_t *girq_result = (uint32_t*)(&(ECIA->GIRQ08_RESULT));
retVal = 0;
if ( girq_id < (MEC_GIRQ_ID_MAX) ) {
/* Each GIRQ has 5 32bit fields: SRC, ENABLE_SET, ENABLE_CLR, RESULT & RESERVED
* please refer INTS_Type in MCHP_device_internal.h
* Based on the girq id calculate the offset in the structure INTS_Type
*
* BASED ON THE STRUCTURE DEFINITION OF INTS_Type ALL FIELDS ARE ALIGNED ON
* 32 BIT BOUNDARY, FOLLOWING WILL NOT WORK IF THIS SCHEME CHANGES
*/
girq_result += (5 * girq_id);
retVal = (*girq_result & (1ul << (bitnum & 0x1Fu)));
}
return retVal;
}
/* ------------------------------------------------------------------------------- */
/* Operations on all GIRQs */
/* ------------------------------------------------------------------------------- */
/** Clear all aggregator GIRQn status registers */
void p_interrupt_ecia_girqs_source_reset(void)
{
uint16_t i;
__IO uint32_t *girq_source = (uint32_t*)ECIA;
for ( i = 0u; i < (MEC_GIRQ_ID_MAX); i++ ) {
/* Each GIRQ has 5 32bit fields: SRC, ENABLE_SET, ENABLE_CLR, RESULT & RESERVED
* please refer INTS_Type in MCHP_device_internal.h
* Based on the girq id calculate the offset in the structure INTS_Type
*
* BASED ON THE STRUCTURE DEFINITION OF INTS_Type ALL FIELDS ARE ALIGNED ON
* 32 BIT BOUNDARY, FOLLOWING WILL NOT WORK IF THIS SCHEME CHANGES
*/
girq_source += 5;
*girq_source = 0xfffffffful;
}
}
/** Clear all aggregator GIRQn enables */
void p_interrupt_ecia_girqs_enable_reset(void)
{
uint16_t i;
__IO uint32_t *girq_enable_clr = (uint32_t*)(&(ECIA->GIRQ08_EN_CLR));
for ( i = 0u; i < (MEC_GIRQ_ID_MAX); i++ ) {
/* Each GIRQ has 5 32bit fields: SRC, ENABLE_SET, ENABLE_CLR, RESULT & RESERVED
* please refer INTS_Type in MCHP_device_internal.h
* Based on the girq id calculate the offset in the structure INTS_Type
*
* BASED ON THE STRUCTURE DEFINITION OF INTS_Type ALL FIELDS ARE ALIGNED ON
* 32 BIT BOUNDARY, FOLLOWING WILL NOT WORK IF THIS SCHEME CHANGES
*/
girq_enable_clr += 5;
*girq_enable_clr = 0xfffffffful;
}
}
/* ------------------------------------------------------------------------------- */
/* Function to set interrupt control */
/* ------------------------------------------------------------------------------- */
/** Set interrupt control
* @param nvic_en_flag : 0 = Alternate NVIC disabled, 1 = Alternate NVIC enabled
*/
void p_interrupt_control_set(uint8_t nvic_en_flag)
{
ECS->INTERRUPT_CONTROL = nvic_en_flag;
}
/** Read interrupt control
* @return uint8_t - 0 = Alternate NVIC disabled, 1 = Alternate NVIC enabled
*/
uint8_t p_interrupt_control_get(void)
{
return (ECS->INTERRUPT_CONTROL & 0x1);
}
/* end interrupt_ecia_perphl.c */
/** @}
*/