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