xref: /nrf52832-nimble/rt-thread/libcpu/arm/sep4020/cpu.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  * 2006-03-13     Bernard      first version
9*10465441SEvalZero  */
10*10465441SEvalZero 
11*10465441SEvalZero #include <rtthread.h>
12*10465441SEvalZero #include <sep4020.h>
13*10465441SEvalZero 
14*10465441SEvalZero extern rt_uint32_t rt_hw_interrupt_disable(void);
15*10465441SEvalZero 
16*10465441SEvalZero //TODO
17*10465441SEvalZero #warning I DON'T KNOW IF THE MMU OPERATION WORKS ON SEP4020
18*10465441SEvalZero 
19*10465441SEvalZero /**
20*10465441SEvalZero  * @addtogroup S3C24X0
21*10465441SEvalZero  */
22*10465441SEvalZero /*@{*/
23*10465441SEvalZero 
24*10465441SEvalZero #define ICACHE_MASK	(rt_uint32_t)(1 << 12)
25*10465441SEvalZero #define DCACHE_MASK	(rt_uint32_t)(1 << 2)
26*10465441SEvalZero 
27*10465441SEvalZero #ifdef __GNUC__
cp15_rd(void)28*10465441SEvalZero rt_inline rt_uint32_t cp15_rd(void)
29*10465441SEvalZero {
30*10465441SEvalZero 	rt_uint32_t i;
31*10465441SEvalZero 
32*10465441SEvalZero 	asm ("mrc p15, 0, %0, c1, c0, 0":"=r" (i));
33*10465441SEvalZero 	return i;
34*10465441SEvalZero }
35*10465441SEvalZero 
36*10465441SEvalZero rt_inline void cache_enable(rt_uint32_t bit)
37*10465441SEvalZero {
38*10465441SEvalZero 	__asm__ __volatile__(			\
39*10465441SEvalZero 		"mrc  p15,0,r0,c1,c0,0\n\t"	\
40*10465441SEvalZero 		"orr  r0,r0,%0\n\t"			\
41*10465441SEvalZero 	   	"mcr  p15,0,r0,c1,c0,0"		\
42*10465441SEvalZero 		:							\
43*10465441SEvalZero 		:"r" (bit)					\
44*10465441SEvalZero 		:"memory");
45*10465441SEvalZero }
46*10465441SEvalZero 
47*10465441SEvalZero rt_inline void cache_disable(rt_uint32_t bit)
48*10465441SEvalZero {
49*10465441SEvalZero 	__asm__ __volatile__(			\
50*10465441SEvalZero 		"mrc  p15,0,r0,c1,c0,0\n\t"	\
51*10465441SEvalZero 		"bic  r0,r0,%0\n\t"			\
52*10465441SEvalZero 		"mcr  p15,0,r0,c1,c0,0"		\
53*10465441SEvalZero 		:							\
54*10465441SEvalZero 		:"r" (bit)					\
55*10465441SEvalZero 		:"memory");
56*10465441SEvalZero }
57*10465441SEvalZero #endif
58*10465441SEvalZero 
59*10465441SEvalZero #ifdef __CC_ARM
60*10465441SEvalZero rt_inline rt_uint32_t cp15_rd(void)
61*10465441SEvalZero {
62*10465441SEvalZero 	rt_uint32_t i;
63*10465441SEvalZero 
64*10465441SEvalZero 	__asm
65*10465441SEvalZero 	{
66*10465441SEvalZero 		mrc p15, 0, i, c1, c0, 0
67*10465441SEvalZero 	}
68*10465441SEvalZero 
69*10465441SEvalZero 	return i;
70*10465441SEvalZero }
71*10465441SEvalZero 
72*10465441SEvalZero rt_inline void cache_enable(rt_uint32_t bit)
73*10465441SEvalZero {
74*10465441SEvalZero 	rt_uint32_t value;
75*10465441SEvalZero 
76*10465441SEvalZero 	__asm
77*10465441SEvalZero 	{
78*10465441SEvalZero 		mrc p15, 0, value, c1, c0, 0
79*10465441SEvalZero 		orr value, value, bit
80*10465441SEvalZero 		mcr p15, 0, value, c1, c0, 0
81*10465441SEvalZero 	}
82*10465441SEvalZero }
83*10465441SEvalZero 
84*10465441SEvalZero rt_inline void cache_disable(rt_uint32_t bit)
85*10465441SEvalZero {
86*10465441SEvalZero 	rt_uint32_t value;
87*10465441SEvalZero 
88*10465441SEvalZero 	__asm
89*10465441SEvalZero 	{
90*10465441SEvalZero 		mrc p15, 0, value, c1, c0, 0
91*10465441SEvalZero 		bic value, value, bit
92*10465441SEvalZero 		mcr p15, 0, value, c1, c0, 0
93*10465441SEvalZero 	}
94*10465441SEvalZero }
95*10465441SEvalZero #endif
96*10465441SEvalZero 
97*10465441SEvalZero /**
98*10465441SEvalZero  * enable I-Cache
99*10465441SEvalZero  *
100*10465441SEvalZero  */
101*10465441SEvalZero void rt_hw_cpu_icache_enable()
102*10465441SEvalZero {
103*10465441SEvalZero 	cache_enable(ICACHE_MASK);
104*10465441SEvalZero }
105*10465441SEvalZero 
106*10465441SEvalZero /**
107*10465441SEvalZero  * disable I-Cache
108*10465441SEvalZero  *
109*10465441SEvalZero  */
110*10465441SEvalZero void rt_hw_cpu_icache_disable()
111*10465441SEvalZero {
112*10465441SEvalZero 	cache_disable(ICACHE_MASK);
113*10465441SEvalZero }
114*10465441SEvalZero 
115*10465441SEvalZero /**
116*10465441SEvalZero  * return the status of I-Cache
117*10465441SEvalZero  *
118*10465441SEvalZero  */
119*10465441SEvalZero rt_base_t rt_hw_cpu_icache_status()
120*10465441SEvalZero {
121*10465441SEvalZero 	return (cp15_rd() & ICACHE_MASK);
122*10465441SEvalZero }
123*10465441SEvalZero 
124*10465441SEvalZero /**
125*10465441SEvalZero  * enable D-Cache
126*10465441SEvalZero  *
127*10465441SEvalZero  */
128*10465441SEvalZero void rt_hw_cpu_dcache_enable()
129*10465441SEvalZero {
130*10465441SEvalZero 	cache_enable(DCACHE_MASK);
131*10465441SEvalZero }
132*10465441SEvalZero 
133*10465441SEvalZero /**
134*10465441SEvalZero  * disable D-Cache
135*10465441SEvalZero  *
136*10465441SEvalZero  */
137*10465441SEvalZero void rt_hw_cpu_dcache_disable()
138*10465441SEvalZero {
139*10465441SEvalZero 	cache_disable(DCACHE_MASK);
140*10465441SEvalZero }
141*10465441SEvalZero 
142*10465441SEvalZero /**
143*10465441SEvalZero  * return the status of D-Cache
144*10465441SEvalZero  *
145*10465441SEvalZero  */
146*10465441SEvalZero rt_base_t rt_hw_cpu_dcache_status()
147*10465441SEvalZero {
148*10465441SEvalZero 	return (cp15_rd() & DCACHE_MASK);
149*10465441SEvalZero }
150*10465441SEvalZero 
151*10465441SEvalZero /**
152*10465441SEvalZero  * reset cpu by dog's time-out
153*10465441SEvalZero  *
154*10465441SEvalZero  */
155*10465441SEvalZero void rt_hw_cpu_reset()
156*10465441SEvalZero {
157*10465441SEvalZero 
158*10465441SEvalZero 	/* enable watchdog */
159*10465441SEvalZero 	*(RP)(RTC_CTR) = 0x02;
160*10465441SEvalZero 
161*10465441SEvalZero 	/*Enable watchdog reset*/
162*10465441SEvalZero 	*(RP)(RTC_INT_EN) = 0x20;
163*10465441SEvalZero 
164*10465441SEvalZero 	/* Initialize watchdog timer count register */
165*10465441SEvalZero 	*(RP)(RTC_WD_CNT) = 0x0001;
166*10465441SEvalZero 
167*10465441SEvalZero 	while(1);	/* loop forever and wait for reset to happen */
168*10465441SEvalZero 
169*10465441SEvalZero 	/* NEVER REACHED */
170*10465441SEvalZero }
171*10465441SEvalZero 
172*10465441SEvalZero /**
173*10465441SEvalZero  *  shutdown CPU
174*10465441SEvalZero  *
175*10465441SEvalZero  */
rt_hw_cpu_shutdown()176*10465441SEvalZero void rt_hw_cpu_shutdown()
177*10465441SEvalZero {
178*10465441SEvalZero 	rt_uint32_t UNUSED level;
179*10465441SEvalZero 	rt_kprintf("shutdown...\n");
180*10465441SEvalZero 
181*10465441SEvalZero 	level = rt_hw_interrupt_disable();
182*10465441SEvalZero 
183*10465441SEvalZero 	RT_ASSERT(RT_NULL);
184*10465441SEvalZero }
185*10465441SEvalZero 
186*10465441SEvalZero /*@}*/
187