1*10465441SEvalZero /* 2*10465441SEvalZero * Copyright (C) 2017 C-SKY Microsystems Co., Ltd. All rights reserved. 3*10465441SEvalZero * 4*10465441SEvalZero * Licensed under the Apache License, Version 2.0 (the "License"); 5*10465441SEvalZero * you may not use this file except in compliance with the License. 6*10465441SEvalZero * You may obtain a copy of the License at 7*10465441SEvalZero * 8*10465441SEvalZero * http://www.apache.org/licenses/LICENSE-2.0 9*10465441SEvalZero * 10*10465441SEvalZero * Unless required by applicable law or agreed to in writing, software 11*10465441SEvalZero * distributed under the License is distributed on an "AS IS" BASIS, 12*10465441SEvalZero * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*10465441SEvalZero * See the License for the specific language governing permissions and 14*10465441SEvalZero * limitations under the License. 15*10465441SEvalZero */ 16*10465441SEvalZero 17*10465441SEvalZero /****************************************************************************** 18*10465441SEvalZero * @file csi_core.h 19*10465441SEvalZero * @brief CSI Core Layer Header File 20*10465441SEvalZero * @version V1.0 21*10465441SEvalZero * @date 02. June 2017 22*10465441SEvalZero ******************************************************************************/ 23*10465441SEvalZero 24*10465441SEvalZero #ifndef _CORE_H_ 25*10465441SEvalZero #define _CORE_H_ 26*10465441SEvalZero 27*10465441SEvalZero #include <stdint.h> 28*10465441SEvalZero #include "csi_gcc.h" 29*10465441SEvalZero 30*10465441SEvalZero #ifdef __cplusplus 31*10465441SEvalZero extern "C" { 32*10465441SEvalZero #endif 33*10465441SEvalZero 34*10465441SEvalZero 35*10465441SEvalZero /* ################################## NVIC function ############################################ */ 36*10465441SEvalZero 37*10465441SEvalZero /** 38*10465441SEvalZero \brief initialize the NVIC interrupt controller 39*10465441SEvalZero \param [in] prio_bits the priority bits of NVIC interrupt controller. 40*10465441SEvalZero */ 41*10465441SEvalZero void drv_nvic_init(uint32_t prio_bits); 42*10465441SEvalZero 43*10465441SEvalZero /** 44*10465441SEvalZero \brief Enable External Interrupt 45*10465441SEvalZero \details Enables a device-specific interrupt in the NVIC interrupt controller. 46*10465441SEvalZero \param [in] irq_num External interrupt number. Value cannot be negative. 47*10465441SEvalZero */ 48*10465441SEvalZero void drv_nvic_enable_irq(int32_t irq_num); 49*10465441SEvalZero /** 50*10465441SEvalZero \brief Disable External Interrupt 51*10465441SEvalZero \details Disables a device-specific interrupt in the NVIC interrupt controller. 52*10465441SEvalZero \param [in] irq_num External interrupt number. Value cannot be negative. 53*10465441SEvalZero */ 54*10465441SEvalZero void drv_nvic_disable_irq(int32_t irq_num); 55*10465441SEvalZero 56*10465441SEvalZero /** 57*10465441SEvalZero \brief Get Pending Interrupt 58*10465441SEvalZero \details Reads the pending register in the NVIC and returns the pending bit for the specified interrupt. 59*10465441SEvalZero \param [in] irq_num Interrupt number. 60*10465441SEvalZero \return 0 Interrupt status is not pending. 61*10465441SEvalZero \return 1 Interrupt status is pending. 62*10465441SEvalZero */ 63*10465441SEvalZero uint32_t drv_nvic_get_pending_irq(int32_t irq_num); 64*10465441SEvalZero 65*10465441SEvalZero /** 66*10465441SEvalZero \brief Set Pending Interrupt 67*10465441SEvalZero \details Sets the pending bit of an external interrupt. 68*10465441SEvalZero \param [in] irq_num Interrupt number. Value cannot be negative. 69*10465441SEvalZero */ 70*10465441SEvalZero void drv_nvic_set_pending_irq(int32_t irq_num); 71*10465441SEvalZero 72*10465441SEvalZero /** 73*10465441SEvalZero \brief Clear Pending Interrupt 74*10465441SEvalZero \details Clears the pending bit of an external interrupt. 75*10465441SEvalZero \param [in] irq_num External interrupt number. Value cannot be negative. 76*10465441SEvalZero */ 77*10465441SEvalZero void drv_nvic_clear_pending_irq(int32_t irq_num); 78*10465441SEvalZero 79*10465441SEvalZero /** 80*10465441SEvalZero \brief Get Active Interrupt 81*10465441SEvalZero \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. 82*10465441SEvalZero \param [in] irq_num Device specific interrupt number. 83*10465441SEvalZero \return 0 Interrupt status is not active. 84*10465441SEvalZero \return 1 Interrupt status is active. 85*10465441SEvalZero \note irq_num must not be negative. 86*10465441SEvalZero */ 87*10465441SEvalZero uint32_t drv_nvic_get_active(int32_t irq_num); 88*10465441SEvalZero 89*10465441SEvalZero /** 90*10465441SEvalZero \brief Set Interrupt Priority 91*10465441SEvalZero \details Sets the priority of an interrupt. 92*10465441SEvalZero \note The priority cannot be set for every core interrupt. 93*10465441SEvalZero \param [in] irq_num Interrupt number. 94*10465441SEvalZero \param [in] priority Priority to set. 95*10465441SEvalZero */ 96*10465441SEvalZero void drv_nvic_set_prio(int32_t irq_num, uint32_t priority); 97*10465441SEvalZero /** 98*10465441SEvalZero \brief Get Interrupt Priority 99*10465441SEvalZero \details Reads the priority of an interrupt. 100*10465441SEvalZero The interrupt number can be positive to specify an external (device specific) interrupt, 101*10465441SEvalZero or negative to specify an internal (core) interrupt. 102*10465441SEvalZero \param [in] irq_num Interrupt number. 103*10465441SEvalZero \return Interrupt Priority. 104*10465441SEvalZero Value is aligned automatically to the implemented priority bits of the microcontroller. 105*10465441SEvalZero */ 106*10465441SEvalZero uint32_t drv_nvic_get_prio(int32_t irq_num); 107*10465441SEvalZero 108*10465441SEvalZero /*@} end of CSI_Core_NVICFunctions */ 109*10465441SEvalZero 110*10465441SEvalZero 111*10465441SEvalZero /* ########################## Cache functions #################################### */ 112*10465441SEvalZero 113*10465441SEvalZero /** 114*10465441SEvalZero \brief Enable I-Cache 115*10465441SEvalZero \details Turns on I-Cache 116*10465441SEvalZero */ 117*10465441SEvalZero void drv_icache_enable(void); 118*10465441SEvalZero 119*10465441SEvalZero /** 120*10465441SEvalZero \brief Disable I-Cache 121*10465441SEvalZero \details Turns off I-Cache 122*10465441SEvalZero */ 123*10465441SEvalZero void drv_icache_disable(void); 124*10465441SEvalZero 125*10465441SEvalZero /** 126*10465441SEvalZero \brief Invalidate I-Cache 127*10465441SEvalZero \details Invalidates I-Cache 128*10465441SEvalZero */ 129*10465441SEvalZero void drv_icache_invalid(void); 130*10465441SEvalZero 131*10465441SEvalZero /** 132*10465441SEvalZero \brief Enable D-Cache 133*10465441SEvalZero \details Turns on D-Cache 134*10465441SEvalZero \note I-Cache also turns on. 135*10465441SEvalZero */ 136*10465441SEvalZero void drv_dcache_enable(void); 137*10465441SEvalZero 138*10465441SEvalZero /** 139*10465441SEvalZero \brief Disable D-Cache 140*10465441SEvalZero \details Turns off D-Cache 141*10465441SEvalZero \note I-Cache also turns off. 142*10465441SEvalZero */ 143*10465441SEvalZero void drv_dcache_disable(void); 144*10465441SEvalZero 145*10465441SEvalZero /** 146*10465441SEvalZero \brief Invalidate D-Cache 147*10465441SEvalZero \details Invalidates D-Cache 148*10465441SEvalZero \note I-Cache also invalid 149*10465441SEvalZero */ 150*10465441SEvalZero void drv_dcache_invalid(void); 151*10465441SEvalZero 152*10465441SEvalZero /** 153*10465441SEvalZero \brief Clean D-Cache 154*10465441SEvalZero \details Cleans D-Cache 155*10465441SEvalZero \note I-Cache also cleans 156*10465441SEvalZero */ 157*10465441SEvalZero void drv_dcache_clean(void); 158*10465441SEvalZero 159*10465441SEvalZero /** 160*10465441SEvalZero \brief Clean & Invalidate D-Cache 161*10465441SEvalZero \details Cleans and Invalidates D-Cache 162*10465441SEvalZero \note I-Cache also flush. 163*10465441SEvalZero */ 164*10465441SEvalZero void drv_dcache_clean_invalid(void); 165*10465441SEvalZero 166*10465441SEvalZero 167*10465441SEvalZero /** 168*10465441SEvalZero \brief D-Cache Invalidate by address 169*10465441SEvalZero \details Invalidates D-Cache for the given address 170*10465441SEvalZero \param[in] addr address (aligned to 16-byte boundary) 171*10465441SEvalZero \param[in] dsize size of memory block (in number of bytes) 172*10465441SEvalZero */ 173*10465441SEvalZero void drv_dcache_invalid_range(uint32_t *addr, int32_t dsize); 174*10465441SEvalZero 175*10465441SEvalZero /** 176*10465441SEvalZero \brief D-Cache Clean by address 177*10465441SEvalZero \details Cleans D-Cache for the given address 178*10465441SEvalZero \param[in] addr address (aligned to 16-byte boundary) 179*10465441SEvalZero \param[in] dsize size of memory block (in number of bytes) 180*10465441SEvalZero */ 181*10465441SEvalZero void drv_dcache_clean_range(uint32_t *addr, int32_t dsize); 182*10465441SEvalZero 183*10465441SEvalZero /** 184*10465441SEvalZero \brief D-Cache Clean and Invalidate by address 185*10465441SEvalZero \details Cleans and invalidates D_Cache for the given address 186*10465441SEvalZero \param[in] addr address (aligned to 16-byte boundary) 187*10465441SEvalZero \param[in] dsize size of memory block (in number of bytes) 188*10465441SEvalZero */ 189*10465441SEvalZero void drv_dcache_clean_invalid_range(uint32_t *addr, int32_t dsize); 190*10465441SEvalZero 191*10465441SEvalZero /** 192*10465441SEvalZero \brief setup cacheable range Cache 193*10465441SEvalZero \details setup Cache range 194*10465441SEvalZero */ 195*10465441SEvalZero void drv_cache_set_range(uint32_t index, uint32_t baseAddr, uint32_t size, uint32_t enable); 196*10465441SEvalZero 197*10465441SEvalZero /** 198*10465441SEvalZero \brief Enable cache profile 199*10465441SEvalZero \details Turns on Cache profile 200*10465441SEvalZero */ 201*10465441SEvalZero void drv_cache_enable_profile(void); 202*10465441SEvalZero 203*10465441SEvalZero /** 204*10465441SEvalZero \brief Disable cache profile 205*10465441SEvalZero \details Turns off Cache profile 206*10465441SEvalZero */ 207*10465441SEvalZero void drv_cache_disable_profile(void); 208*10465441SEvalZero /** 209*10465441SEvalZero \brief Reset cache profile 210*10465441SEvalZero \details Reset Cache profile 211*10465441SEvalZero */ 212*10465441SEvalZero void drv_cache_reset_profile(void); 213*10465441SEvalZero 214*10465441SEvalZero /** 215*10465441SEvalZero \brief cache access times 216*10465441SEvalZero \details Cache access times 217*10465441SEvalZero \note every 256 access add 1. 218*10465441SEvalZero */ 219*10465441SEvalZero uint32_t drv_cache_get_access_time(void); 220*10465441SEvalZero 221*10465441SEvalZero /** 222*10465441SEvalZero \brief cache miss times 223*10465441SEvalZero \details Cache miss times 224*10465441SEvalZero \note every 256 miss add 1. 225*10465441SEvalZero */ 226*10465441SEvalZero uint32_t drv_cache_get_miss_time(void); 227*10465441SEvalZero 228*10465441SEvalZero /* ################################## SysTick function ############################################ */ 229*10465441SEvalZero 230*10465441SEvalZero /** 231*10465441SEvalZero \brief CORE timer Configuration 232*10465441SEvalZero \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. 233*10465441SEvalZero Counter is in free running mode to generate periodic interrupts. 234*10465441SEvalZero \param [in] ticks Number of ticks between two interrupts. 235*10465441SEvalZero \param [in] irq_num core timer Interrupt number. 236*10465441SEvalZero \return 0 Function succeeded. 237*10465441SEvalZero \return 1 Function failed. 238*10465441SEvalZero \note When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the 239*10465441SEvalZero function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b> 240*10465441SEvalZero must contain a vendor-specific implementation of this function. 241*10465441SEvalZero */ 242*10465441SEvalZero uint32_t drv_coret_config(uint32_t ticks, int32_t irq_num); 243*10465441SEvalZero 244*10465441SEvalZero #ifdef __cplusplus 245*10465441SEvalZero } 246*10465441SEvalZero #endif 247*10465441SEvalZero 248*10465441SEvalZero #endif /* _CORE_H_ */ 249