--- /dev/null
+/*
+ * 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 csi_core.h
+ * @brief CSI Core Layer Header File
+ * @version V1.0
+ * @date 02. June 2017
+ ******************************************************************************/
+
+#ifndef _CORE_H_
+#define _CORE_H_
+
+#include <stdint.h>
+#include "csi_gcc.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* ################################## NVIC function ############################################ */
+
+/**
+ \brief initialize the NVIC interrupt controller
+ \param [in] prio_bits the priority bits of NVIC interrupt controller.
+ */
+void drv_nvic_init(uint32_t prio_bits);
+
+/**
+ \brief Enable External Interrupt
+ \details Enables a device-specific interrupt in the NVIC interrupt controller.
+ \param [in] irq_num External interrupt number. Value cannot be negative.
+ */
+void drv_nvic_enable_irq(int32_t irq_num);
+/**
+ \brief Disable External Interrupt
+ \details Disables a device-specific interrupt in the NVIC interrupt controller.
+ \param [in] irq_num External interrupt number. Value cannot be negative.
+ */
+void drv_nvic_disable_irq(int32_t irq_num);
+
+/**
+ \brief Get Pending Interrupt
+ \details Reads the pending register in the NVIC and returns the pending bit for the specified interrupt.
+ \param [in] irq_num Interrupt number.
+ \return 0 Interrupt status is not pending.
+ \return 1 Interrupt status is pending.
+ */
+uint32_t drv_nvic_get_pending_irq(int32_t irq_num);
+
+/**
+ \brief Set Pending Interrupt
+ \details Sets the pending bit of an external interrupt.
+ \param [in] irq_num Interrupt number. Value cannot be negative.
+ */
+void drv_nvic_set_pending_irq(int32_t irq_num);
+
+/**
+ \brief Clear Pending Interrupt
+ \details Clears the pending bit of an external interrupt.
+ \param [in] irq_num External interrupt number. Value cannot be negative.
+ */
+void drv_nvic_clear_pending_irq(int32_t irq_num);
+
+/**
+ \brief Get Active Interrupt
+ \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt.
+ \param [in] irq_num Device specific interrupt number.
+ \return 0 Interrupt status is not active.
+ \return 1 Interrupt status is active.
+ \note irq_num must not be negative.
+ */
+uint32_t drv_nvic_get_active(int32_t irq_num);
+
+/**
+ \brief Set Interrupt Priority
+ \details Sets the priority of an interrupt.
+ \note The priority cannot be set for every core interrupt.
+ \param [in] irq_num Interrupt number.
+ \param [in] priority Priority to set.
+*/
+void drv_nvic_set_prio(int32_t irq_num, 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] irq_num Interrupt number.
+ \return Interrupt Priority.
+ Value is aligned automatically to the implemented priority bits of the microcontroller.
+ */
+uint32_t drv_nvic_get_prio(int32_t irq_num);
+
+/*@} end of CSI_Core_NVICFunctions */
+
+
+/* ########################## Cache functions #################################### */
+
+/**
+ \brief Enable I-Cache
+ \details Turns on I-Cache
+ */
+void drv_icache_enable(void);
+
+/**
+ \brief Disable I-Cache
+ \details Turns off I-Cache
+ */
+void drv_icache_disable(void);
+
+/**
+ \brief Invalidate I-Cache
+ \details Invalidates I-Cache
+ */
+void drv_icache_invalid(void);
+
+/**
+ \brief Enable D-Cache
+ \details Turns on D-Cache
+ \note I-Cache also turns on.
+ */
+void drv_dcache_enable(void);
+
+/**
+ \brief Disable D-Cache
+ \details Turns off D-Cache
+ \note I-Cache also turns off.
+ */
+void drv_dcache_disable(void);
+
+/**
+ \brief Invalidate D-Cache
+ \details Invalidates D-Cache
+ \note I-Cache also invalid
+ */
+void drv_dcache_invalid(void);
+
+/**
+ \brief Clean D-Cache
+ \details Cleans D-Cache
+ \note I-Cache also cleans
+ */
+void drv_dcache_clean(void);
+
+/**
+ \brief Clean & Invalidate D-Cache
+ \details Cleans and Invalidates D-Cache
+ \note I-Cache also flush.
+ */
+void drv_dcache_clean_invalid(void);
+
+
+/**
+ \brief D-Cache Invalidate by address
+ \details Invalidates D-Cache for the given address
+ \param[in] addr address (aligned to 16-byte boundary)
+ \param[in] dsize size of memory block (in number of bytes)
+*/
+void drv_dcache_invalid_range(uint32_t *addr, int32_t dsize);
+
+/**
+ \brief D-Cache Clean by address
+ \details Cleans D-Cache for the given address
+ \param[in] addr address (aligned to 16-byte boundary)
+ \param[in] dsize size of memory block (in number of bytes)
+*/
+void drv_dcache_clean_range(uint32_t *addr, int32_t dsize);
+
+/**
+ \brief D-Cache Clean and Invalidate by address
+ \details Cleans and invalidates D_Cache for the given address
+ \param[in] addr address (aligned to 16-byte boundary)
+ \param[in] dsize size of memory block (in number of bytes)
+*/
+void drv_dcache_clean_invalid_range(uint32_t *addr, int32_t dsize);
+
+/**
+ \brief setup cacheable range Cache
+ \details setup Cache range
+ */
+void drv_cache_set_range(uint32_t index, uint32_t baseAddr, uint32_t size, uint32_t enable);
+
+/**
+ \brief Enable cache profile
+ \details Turns on Cache profile
+ */
+void drv_cache_enable_profile(void);
+
+/**
+ \brief Disable cache profile
+ \details Turns off Cache profile
+ */
+void drv_cache_disable_profile(void);
+/**
+ \brief Reset cache profile
+ \details Reset Cache profile
+ */
+void drv_cache_reset_profile(void);
+
+/**
+ \brief cache access times
+ \details Cache access times
+ \note every 256 access add 1.
+ */
+uint32_t drv_cache_get_access_time(void);
+
+/**
+ \brief cache miss times
+ \details Cache miss times
+ \note every 256 miss add 1.
+ */
+uint32_t drv_cache_get_miss_time(void);
+
+/* ################################## SysTick function ############################################ */
+
+/**
+ \brief CORE timer Configuration
+ \details Initializes the System Timer and its interrupt, and starts the System Tick Timer.
+ Counter is in free running mode to generate periodic interrupts.
+ \param [in] ticks Number of ticks between two interrupts.
+ \param [in] irq_num core timer Interrupt number.
+ \return 0 Function succeeded.
+ \return 1 Function failed.
+ \note When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the
+ function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>
+ must contain a vendor-specific implementation of this function.
+ */
+uint32_t drv_coret_config(uint32_t ticks, int32_t irq_num);
+
+/**
+ \brief get CORE timer reload value
+ \return CORE timer counter value.
+ */
+uint32_t drv_coret_get_load(void);
+
+/**
+ \brief get CORE timer counter value
+ \return CORE timer counter value.
+ */
+uint32_t drv_coret_get_value(void);
+
+/**
+ \brief Save the Irq context
+ \details save the psr result before disable irq.
+ \param [in] irq_num External interrupt number. Value cannot be negative.
+ */
+__ALWAYS_INLINE uint32_t drv_irq_save(void)
+{
+ uint32_t result;
+ result = __get_PSR();
+ __disable_irq();
+ return(result);
+}
+
+/**
+ \brief Restore the Irq context
+ \details restore saved primask state.
+ \param [in] irq_state psr irq state.
+ */
+__ALWAYS_INLINE void drv_irq_restore(uint32_t irq_state)
+{
+ __set_PSR(irq_state);
+}
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _CORE_H_ */