/*
 * Copyright (C) 2017 C-SKY Microsystems Co., Ltd. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/******************************************************************************
 * @file     drv_intc.h
 * @brief    header file for intc driver
 * @version  V1.0
 * @date     02. June 2017
 ******************************************************************************/

#ifndef _CSI_INTC_H_
#define _CSI_INTC_H_

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>
#include <drv_common.h>

typedef enum int_trigger_mode_t
{
    INT_MODE_LOW_LEVEL,
    INT_MODE_HIGH_LEVEL,
    INT_MODE_RISING_EDGE,
    INT_MODE_FALLING_EDGE,
    INT_MODE_DOUBLE_EDGE,
} int_trigger_mode_t;

/**
  \brief   initialize the INTC interrupt controller
  \param [in]      prio_bits  the priority bits of INTC interrupt controller.
 */
void csi_intc_init(void);

/**
  \brief   Enable External Interrupt
  \details Enables a device-specific interrupt in the INTC interrupt controller.
  \param [in]      IRQn  External interrupt number. Value cannot be negative.
 */
void csi_intc_enable_irq(int32_t IRQn);

/**
  \brief   Disable External Interrupt
  \details Disables a device-specific interrupt in the INTC interrupt controller.
  \param [in]      IRQn  External interrupt number. Value cannot be negative.
 */
void csi_intc_disable_irq(int32_t IRQn);

/**
  \brief   Get Pending Interrupt
  \details Reads the pending register in the INTC and returns the pending bit for the specified interrupt.
  \param [in]      IRQn  Interrupt number.
  \return             0  Interrupt status is not pending.
  \return             1  Interrupt status is pending.
 */
uint32_t csi_intc_get_pending_irq(int32_t IRQn);

/**
  \brief   Set Pending Interrupt
  \details Sets the pending bit of an external interrupt.
  \param [in]      IRQn  Interrupt number. Value cannot be negative.
 */
void csi_intc_set_pending_irq(int32_t IRQn);

/**
  \brief   Clear Pending Interrupt
  \details Clears the pending bit of an external interrupt.
  \param [in]      IRQn  External interrupt number. Value cannot be negative.
 */
void csi_intc_clear_pending_irq(int32_t IRQn);

/**
  \brief   Get Wake up Interrupt
  \details Reads the wake up register in the INTC and returns the pending bit for the specified interrupt.
  \param [in]      IRQn  Interrupt number.
  \return             0  Interrupt is not set as wake up interrupt.
  \return             1  Interrupt is set as wake up interrupt.
 */
uint32_t csi_intc_get_wakeup_irq(int32_t IRQn);

/**
  \brief   Set Wake up Interrupt
  \details Sets the wake up bit of an external interrupt.
  \param [in]      IRQn  Interrupt number. Value cannot be negative.
 */
void csi_intc_set_wakeup_irq(int32_t IRQn);

/**
  \brief   Clear Wake up Interrupt
  \details Clears the wake up bit of an external interrupt.
  \param [in]      IRQn  External interrupt number. Value cannot be negative.
 */
void csi_intc_clear_wakeup_irq(int32_t IRQn);

/**
  \brief   Get Active Interrupt
  \details Reads the active register in the INTC and returns the active bit for the device specific interrupt.
  \param [in]      IRQn  Device specific interrupt number.
  \return             0  Interrupt status is not active.
  \return             1  Interrupt status is active.
  \note    IRQn must not be negative.
 */
uint32_t csi_intc_get_active(int32_t IRQn);

/**
  \brief   Set Threshold register
  \details set the threshold register in the INTC.
  \param [in]      VectThreshold  specific vecter threshold.
  \param [in]      PrioThreshold  specific priority threshold.
 */
void csi_intc_set_threshold(uint32_t VectThreshold, uint32_t PrioThreshold);

/**
  \brief   Set Interrupt Priority
  \details Sets the priority of an interrupt.
  \note    The priority cannot be set for every core interrupt.
  \param [in]      IRQn  Interrupt number.
  \param [in]  priority  Priority to set.
 */
void csi_intc_set_prio(int32_t IRQn, uint32_t priority);

/**
  \brief   Get Interrupt Priority
  \details Reads the priority of an interrupt.
           The interrupt number can be positive to specify an external (device specific) interrupt,
           or negative to specify an internal (core) interrupt.
  \param [in]   IRQn  Interrupt number.
  \return             Interrupt Priority.
                      Value is aligned automatically to the implemented priority bits of the microcontroller.
 */
uint32_t csi_intc_get_prio(int32_t IRQn);

/**
  \brief  funciton is acknowledge the IRQ. this interface is internally used by irq system
  \param[in]       irq         irq number to operate
  \return          0 on success; -1 on failure
 */
int csi_intc_ack_irq(int32_t IRQn);

/**
  \briefThis function is set the attributes of an IRQ.
  \param[in]	 irq			 irq number to operate
  \param[in]	 priority		 interrupt priority
  \param[in]	 trigger_mode	 interrupt trigger_mode
  \return 	 0 on success; -1 on failure
*/
int csi_intc_set_attribute(int32_t IRQn, uint32_t priority,int_trigger_mode_t trigger_mode);

#endif /* _CSI_INTC_H_ */

