xref: /nrf52832-nimble/rt-thread/libcpu/c-sky/common/csi_core.h (revision 104654410c56c573564690304ae786df310c91fc)
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