xref: /nrf52832-nimble/rt-thread/libcpu/c-sky/common/csi_reg.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_reg.h
19*10465441SEvalZero  * @brief    CSI Header File for reg.
20*10465441SEvalZero  * @version  V1.0
21*10465441SEvalZero  * @date     02. June 2017
22*10465441SEvalZero  ******************************************************************************/
23*10465441SEvalZero 
24*10465441SEvalZero #ifndef _CSI_REG_H_
25*10465441SEvalZero #define _CSI_REG_H_
26*10465441SEvalZero 
27*10465441SEvalZero #include<csi_gcc.h>
28*10465441SEvalZero 
29*10465441SEvalZero /**
30*10465441SEvalZero   \brief   Enable IRQ Interrupts
31*10465441SEvalZero   \details Enables IRQ interrupts by setting the IE-bit in the PSR.
32*10465441SEvalZero            Can only be executed in Privileged modes.
33*10465441SEvalZero  */
__enable_irq(void)34*10465441SEvalZero __ALWAYS_INLINE void __enable_irq(void)
35*10465441SEvalZero {
36*10465441SEvalZero     __ASM volatile("psrset ie");
37*10465441SEvalZero }
38*10465441SEvalZero 
39*10465441SEvalZero 
40*10465441SEvalZero 
41*10465441SEvalZero /**
42*10465441SEvalZero   \brief   Disable IRQ Interrupts
43*10465441SEvalZero   \details Disables IRQ interrupts by clearing the IE-bit in the PSR.
44*10465441SEvalZero   Can only be executed in Privileged modes.
45*10465441SEvalZero  */
__disable_irq(void)46*10465441SEvalZero __ALWAYS_INLINE void __disable_irq(void)
47*10465441SEvalZero {
48*10465441SEvalZero     __ASM volatile("psrclr ie");
49*10465441SEvalZero }
50*10465441SEvalZero 
51*10465441SEvalZero /**
52*10465441SEvalZero   \brief   Get PSR
53*10465441SEvalZero   \details Returns the content of the PSR Register.
54*10465441SEvalZero   \return               PSR Register value
55*10465441SEvalZero  */
__get_PSR(void)56*10465441SEvalZero __ALWAYS_INLINE uint32_t __get_PSR(void)
57*10465441SEvalZero {
58*10465441SEvalZero     uint32_t result;
59*10465441SEvalZero 
60*10465441SEvalZero     __ASM volatile("mfcr %0, psr" : "=r"(result));
61*10465441SEvalZero     return (result);
62*10465441SEvalZero }
63*10465441SEvalZero 
64*10465441SEvalZero /**
65*10465441SEvalZero   \brief   Set PSR
66*10465441SEvalZero   \details Writes the given value to the PSR Register.
67*10465441SEvalZero   \param [in]    psr  PSR Register value to set
68*10465441SEvalZero  */
__set_PSR(uint32_t psr)69*10465441SEvalZero __ALWAYS_INLINE void __set_PSR(uint32_t psr)
70*10465441SEvalZero {
71*10465441SEvalZero     __ASM volatile("mtcr %0, psr" : : "r"(psr));
72*10465441SEvalZero }
73*10465441SEvalZero 
74*10465441SEvalZero /**
75*10465441SEvalZero   \brief   Get SP
76*10465441SEvalZero   \details Returns the content of the SP Register.
77*10465441SEvalZero   \return               SP Register value
78*10465441SEvalZero  */
__get_SP(void)79*10465441SEvalZero __ALWAYS_INLINE uint32_t __get_SP(void)
80*10465441SEvalZero {
81*10465441SEvalZero     uint32_t result;
82*10465441SEvalZero 
83*10465441SEvalZero     __ASM volatile("mov %0, sp" : "=r"(result));
84*10465441SEvalZero     return (result);
85*10465441SEvalZero }
86*10465441SEvalZero 
87*10465441SEvalZero /**
88*10465441SEvalZero   \brief   Set SP
89*10465441SEvalZero   \details Writes the given value to the SP Register.
90*10465441SEvalZero   \param [in]    sp  SP Register value to set
91*10465441SEvalZero  */
__set_SP(uint32_t sp)92*10465441SEvalZero __ALWAYS_INLINE void __set_SP(uint32_t sp)
93*10465441SEvalZero {
94*10465441SEvalZero     __ASM volatile("mov sp, %0" : : "r"(sp): "sp");
95*10465441SEvalZero }
96*10465441SEvalZero 
97*10465441SEvalZero 
98*10465441SEvalZero /**
99*10465441SEvalZero   \brief   Get VBR Register
100*10465441SEvalZero   \details Returns the content of the VBR Register.
101*10465441SEvalZero   \return               VBR Register value
102*10465441SEvalZero  */
__get_VBR(void)103*10465441SEvalZero __ALWAYS_INLINE uint32_t __get_VBR(void)
104*10465441SEvalZero {
105*10465441SEvalZero     uint32_t result;
106*10465441SEvalZero 
107*10465441SEvalZero     __ASM volatile("mfcr %0, vbr" : "=r"(result));
108*10465441SEvalZero     return (result);
109*10465441SEvalZero }
110*10465441SEvalZero 
111*10465441SEvalZero /**
112*10465441SEvalZero   \brief   Set VBR
113*10465441SEvalZero   \details Writes the given value to the VBR Register.
114*10465441SEvalZero   \param [in]    vbr  VBR Register value to set
115*10465441SEvalZero  */
__set_VBR(uint32_t vbr)116*10465441SEvalZero __ALWAYS_INLINE void __set_VBR(uint32_t vbr)
117*10465441SEvalZero {
118*10465441SEvalZero     __ASM volatile("mtcr %0, vbr" : : "r"(vbr));
119*10465441SEvalZero }
120*10465441SEvalZero 
121*10465441SEvalZero /**
122*10465441SEvalZero   \brief   Get EPC Register
123*10465441SEvalZero   \details Returns the content of the EPC Register.
124*10465441SEvalZero   \return               EPC Register value
125*10465441SEvalZero  */
__get_EPC(void)126*10465441SEvalZero __ALWAYS_INLINE uint32_t __get_EPC(void)
127*10465441SEvalZero {
128*10465441SEvalZero     uint32_t result;
129*10465441SEvalZero 
130*10465441SEvalZero     __ASM volatile("mfcr %0, epc" : "=r"(result));
131*10465441SEvalZero     return (result);
132*10465441SEvalZero }
133*10465441SEvalZero 
134*10465441SEvalZero /**
135*10465441SEvalZero   \brief   Set EPC
136*10465441SEvalZero   \details Writes the given value to the EPC Register.
137*10465441SEvalZero   \param [in]    epc  EPC Register value to set
138*10465441SEvalZero  */
__set_EPC(uint32_t epc)139*10465441SEvalZero __ALWAYS_INLINE void __set_EPC(uint32_t epc)
140*10465441SEvalZero {
141*10465441SEvalZero     __ASM volatile("mtcr %0, epc" : : "r"(epc));
142*10465441SEvalZero }
143*10465441SEvalZero 
144*10465441SEvalZero /**
145*10465441SEvalZero   \brief   Get EPSR
146*10465441SEvalZero   \details Returns the content of the EPSR Register.
147*10465441SEvalZero   \return               EPSR Register value
148*10465441SEvalZero  */
__get_EPSR(void)149*10465441SEvalZero __ALWAYS_INLINE uint32_t __get_EPSR(void)
150*10465441SEvalZero {
151*10465441SEvalZero     uint32_t result;
152*10465441SEvalZero 
153*10465441SEvalZero     __ASM volatile("mfcr %0, epsr" : "=r"(result));
154*10465441SEvalZero     return (result);
155*10465441SEvalZero }
156*10465441SEvalZero 
157*10465441SEvalZero /**
158*10465441SEvalZero   \brief   Set EPSR
159*10465441SEvalZero   \details Writes the given value to the EPSR Register.
160*10465441SEvalZero   \param [in]    epsr  EPSR Register value to set
161*10465441SEvalZero  */
__set_EPSR(uint32_t epsr)162*10465441SEvalZero __ALWAYS_INLINE void __set_EPSR(uint32_t epsr)
163*10465441SEvalZero {
164*10465441SEvalZero     __ASM volatile("mtcr %0, epsr" : : "r"(epsr));
165*10465441SEvalZero }
166*10465441SEvalZero 
167*10465441SEvalZero /**
168*10465441SEvalZero   \brief   Get CPUID Register
169*10465441SEvalZero   \details Returns the content of the CPUID Register.
170*10465441SEvalZero   \return               CPUID Register value
171*10465441SEvalZero  */
__get_CPUID(void)172*10465441SEvalZero __ALWAYS_INLINE uint32_t __get_CPUID(void)
173*10465441SEvalZero {
174*10465441SEvalZero     uint32_t result;
175*10465441SEvalZero 
176*10465441SEvalZero     __ASM volatile("mfcr %0, cr<13, 0>" : "=r"(result));
177*10465441SEvalZero     return (result);
178*10465441SEvalZero }
179*10465441SEvalZero 
180*10465441SEvalZero #if       (__SOFTRESET_PRESENT == 1U)
181*10465441SEvalZero /**
182*10465441SEvalZero   \brief   Set SRCR
183*10465441SEvalZero   \details Assigns the given value to the SRCR.
184*10465441SEvalZero   \param [in]    srcr  SRCR value to set
185*10465441SEvalZero  */
__set_SRCR(uint32_t srcr)186*10465441SEvalZero __ALWAYS_INLINE void __set_SRCR(uint32_t srcr)
187*10465441SEvalZero {
188*10465441SEvalZero     __ASM volatile("mtcr %0, cr<31, 0>\n" : : "r"(srcr));
189*10465441SEvalZero }
190*10465441SEvalZero #endif /* __SOFTRESET_PRESENT == 1U */
191*10465441SEvalZero 
192*10465441SEvalZero #if       (__MGU_PRESENT == 1U)
193*10465441SEvalZero /**
194*10465441SEvalZero   \brief   Get CCR
195*10465441SEvalZero   \details Returns the current value of the CCR.
196*10465441SEvalZero   \return               CCR Register value
197*10465441SEvalZero  */
__get_CCR(void)198*10465441SEvalZero __ALWAYS_INLINE uint32_t __get_CCR(void)
199*10465441SEvalZero {
200*10465441SEvalZero     register uint32_t result;
201*10465441SEvalZero 
202*10465441SEvalZero     __ASM volatile("mfcr %0, cr<18, 0>\n"  : "=r"(result));
203*10465441SEvalZero     return (result);
204*10465441SEvalZero }
205*10465441SEvalZero 
206*10465441SEvalZero 
207*10465441SEvalZero /**
208*10465441SEvalZero   \brief   Set CCR
209*10465441SEvalZero   \details Assigns the given value to the CCR.
210*10465441SEvalZero   \param [in]    ccr  CCR value to set
211*10465441SEvalZero  */
__set_CCR(uint32_t ccr)212*10465441SEvalZero __ALWAYS_INLINE void __set_CCR(uint32_t ccr)
213*10465441SEvalZero {
214*10465441SEvalZero     __ASM volatile("mtcr %0, cr<18, 0>\n" : : "r"(ccr));
215*10465441SEvalZero }
216*10465441SEvalZero 
217*10465441SEvalZero 
218*10465441SEvalZero /**
219*10465441SEvalZero   \brief   Get CAPR
220*10465441SEvalZero   \details Returns the current value of the CAPR.
221*10465441SEvalZero   \return               CAPR Register value
222*10465441SEvalZero  */
__get_CAPR(void)223*10465441SEvalZero __ALWAYS_INLINE uint32_t __get_CAPR(void)
224*10465441SEvalZero {
225*10465441SEvalZero     register uint32_t result;
226*10465441SEvalZero 
227*10465441SEvalZero     __ASM volatile("mfcr %0, cr<19, 0>\n" : "=r"(result));
228*10465441SEvalZero     return (result);
229*10465441SEvalZero }
230*10465441SEvalZero 
231*10465441SEvalZero /**
232*10465441SEvalZero   \brief   Set CAPR
233*10465441SEvalZero   \details Assigns the given value to the CAPR.
234*10465441SEvalZero   \param [in]    capr  CAPR value to set
235*10465441SEvalZero  */
__set_CAPR(uint32_t capr)236*10465441SEvalZero __ALWAYS_INLINE void __set_CAPR(uint32_t capr)
237*10465441SEvalZero {
238*10465441SEvalZero     __ASM volatile("mtcr %0, cr<19, 0>\n" : : "r"(capr));
239*10465441SEvalZero }
240*10465441SEvalZero 
241*10465441SEvalZero 
242*10465441SEvalZero /**
243*10465441SEvalZero   \brief   Set PACR
244*10465441SEvalZero   \details Assigns the given value to the PACR.
245*10465441SEvalZero 
246*10465441SEvalZero     \param [in]    pacr  PACR value to set
247*10465441SEvalZero  */
__set_PACR(uint32_t pacr)248*10465441SEvalZero __ALWAYS_INLINE void __set_PACR(uint32_t pacr)
249*10465441SEvalZero {
250*10465441SEvalZero     __ASM volatile("mtcr %0, cr<20, 0>\n" : : "r"(pacr));
251*10465441SEvalZero }
252*10465441SEvalZero 
253*10465441SEvalZero 
254*10465441SEvalZero /**
255*10465441SEvalZero   \brief   Get PACR
256*10465441SEvalZero   \details Returns the current value of PACR.
257*10465441SEvalZero   \return               PACR value
258*10465441SEvalZero  */
__get_PACR(void)259*10465441SEvalZero __ALWAYS_INLINE uint32_t __get_PACR(void)
260*10465441SEvalZero {
261*10465441SEvalZero     uint32_t result;
262*10465441SEvalZero 
263*10465441SEvalZero     __ASM volatile("mfcr %0, cr<20, 0>" : "=r"(result));
264*10465441SEvalZero     return (result);
265*10465441SEvalZero }
266*10465441SEvalZero 
267*10465441SEvalZero /**
268*10465441SEvalZero   \brief   Set PRSR
269*10465441SEvalZero   \details Assigns the given value to the PRSR.
270*10465441SEvalZero 
271*10465441SEvalZero     \param [in]    prsr  PRSR value to set
272*10465441SEvalZero  */
__set_PRSR(uint32_t prsr)273*10465441SEvalZero __ALWAYS_INLINE void __set_PRSR(uint32_t prsr)
274*10465441SEvalZero {
275*10465441SEvalZero     __ASM volatile("mtcr %0, cr<21, 0>\n" : : "r"(prsr));
276*10465441SEvalZero }
277*10465441SEvalZero 
278*10465441SEvalZero /**
279*10465441SEvalZero   \brief   Get PRSR
280*10465441SEvalZero   \details Returns the current value of PRSR.
281*10465441SEvalZero   \return               PRSR value
282*10465441SEvalZero  */
__get_PRSR(void)283*10465441SEvalZero __ALWAYS_INLINE uint32_t __get_PRSR(void)
284*10465441SEvalZero {
285*10465441SEvalZero     uint32_t result;
286*10465441SEvalZero 
287*10465441SEvalZero     __ASM volatile("mfcr %0, cr<21, 0>" : "=r"(result));
288*10465441SEvalZero     return (result);
289*10465441SEvalZero }
290*10465441SEvalZero #endif /* __MGU_PRESENT == 1U */
291*10465441SEvalZero 
292*10465441SEvalZero /**
293*10465441SEvalZero   \brief   Get user sp
294*10465441SEvalZero   \details Returns the current value of user r14.
295*10465441SEvalZero   \return               UR14 value
296*10465441SEvalZero  */
__get_UR14(void)297*10465441SEvalZero __ALWAYS_INLINE uint32_t __get_UR14(void)
298*10465441SEvalZero {
299*10465441SEvalZero     uint32_t result;
300*10465441SEvalZero 
301*10465441SEvalZero     __ASM volatile("mfcr %0, cr<14, 1>" : "=r"(result));
302*10465441SEvalZero     return (result);
303*10465441SEvalZero }
304*10465441SEvalZero 
305*10465441SEvalZero /**
306*10465441SEvalZero   \brief   Enable interrupts and exceptions
307*10465441SEvalZero   \details Enables interrupts and exceptions by setting the IE-bit and EE-bit in the PSR.
308*10465441SEvalZero            Can only be executed in Privileged modes.
309*10465441SEvalZero  */
__enable_excp_irq(void)310*10465441SEvalZero __ALWAYS_INLINE void __enable_excp_irq(void)
311*10465441SEvalZero {
312*10465441SEvalZero     __ASM volatile("psrset ee, ie");
313*10465441SEvalZero }
314*10465441SEvalZero 
315*10465441SEvalZero 
316*10465441SEvalZero /**
317*10465441SEvalZero   \brief   Disable interrupts and exceptions
318*10465441SEvalZero   \details Disables interrupts and exceptions by clearing the IE-bit and EE-bit in the PSR.
319*10465441SEvalZero            Can only be executed in Privileged modes.
320*10465441SEvalZero  */
__disable_excp_irq(void)321*10465441SEvalZero __ALWAYS_INLINE void __disable_excp_irq(void)
322*10465441SEvalZero {
323*10465441SEvalZero     __ASM volatile("psrclr ee, ie");
324*10465441SEvalZero }
325*10465441SEvalZero 
326*10465441SEvalZero #if       (__GSR_GCR_PRESENT == 1U)
327*10465441SEvalZero /**
328*10465441SEvalZero   \brief   Get GSR
329*10465441SEvalZero   \details Returns the content of the GSR Register.
330*10465441SEvalZero   \return               GSR Register value
331*10465441SEvalZero  */
__get_GSR(void)332*10465441SEvalZero __ALWAYS_INLINE uint32_t __get_GSR(void)
333*10465441SEvalZero {
334*10465441SEvalZero     uint32_t result;
335*10465441SEvalZero 
336*10465441SEvalZero     __ASM volatile("mfcr %0, cr<12, 0>" : "=r"(result));
337*10465441SEvalZero     return (result);
338*10465441SEvalZero }
339*10465441SEvalZero 
340*10465441SEvalZero /**
341*10465441SEvalZero   \brief   Get GCR
342*10465441SEvalZero   \details Returns the content of the GCR Register.
343*10465441SEvalZero   \return               GCR Register value
344*10465441SEvalZero  */
__get_GCR(void)345*10465441SEvalZero __ALWAYS_INLINE uint32_t __get_GCR(void)
346*10465441SEvalZero {
347*10465441SEvalZero     uint32_t result;
348*10465441SEvalZero 
349*10465441SEvalZero     __ASM volatile("mfcr %0, cr<11, 0>" : "=r"(result));
350*10465441SEvalZero     return (result);
351*10465441SEvalZero }
352*10465441SEvalZero 
353*10465441SEvalZero /**
354*10465441SEvalZero   \brief   Set GCR
355*10465441SEvalZero   \details Writes the given value to the GCR Register.
356*10465441SEvalZero   \param [in]    gcr  GCR Register value to set
357*10465441SEvalZero  */
__set_GCR(uint32_t gcr)358*10465441SEvalZero __ALWAYS_INLINE void __set_GCR(uint32_t gcr)
359*10465441SEvalZero {
360*10465441SEvalZero     __ASM volatile("mtcr %0, cr<11, 0>" : : "r"(gcr));
361*10465441SEvalZero }
362*10465441SEvalZero 
363*10465441SEvalZero #endif /* (__GSR_GCR_PRESENT == 1U) */
364*10465441SEvalZero 
365*10465441SEvalZero 
366*10465441SEvalZero #endif /* _CSI_REG_H_ */
367