xref: /nrf52832-nimble/rt-thread/libcpu/arm/s3c24x0/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 <rthw.h>
12*10465441SEvalZero #include <rtthread.h>
13*10465441SEvalZero #include "s3c24x0.h"
14*10465441SEvalZero 
15*10465441SEvalZero /**
16*10465441SEvalZero  * @addtogroup S3C24X0
17*10465441SEvalZero  */
18*10465441SEvalZero /*@{*/
19*10465441SEvalZero 
20*10465441SEvalZero #define ICACHE_MASK	(rt_uint32_t)(1 << 12)
21*10465441SEvalZero #define DCACHE_MASK	(rt_uint32_t)(1 << 2)
22*10465441SEvalZero 
23*10465441SEvalZero #ifdef __GNUC__
cp15_rd(void)24*10465441SEvalZero rt_inline rt_uint32_t cp15_rd(void)
25*10465441SEvalZero {
26*10465441SEvalZero 	rt_uint32_t i;
27*10465441SEvalZero 
28*10465441SEvalZero 	asm ("mrc p15, 0, %0, c1, c0, 0":"=r" (i));
29*10465441SEvalZero 	return i;
30*10465441SEvalZero }
31*10465441SEvalZero 
cache_enable(rt_uint32_t bit)32*10465441SEvalZero rt_inline void cache_enable(rt_uint32_t bit)
33*10465441SEvalZero {
34*10465441SEvalZero 	__asm__ __volatile__(			\
35*10465441SEvalZero 		"mrc  p15,0,r0,c1,c0,0\n\t"	\
36*10465441SEvalZero 		"orr  r0,r0,%0\n\t"			\
37*10465441SEvalZero 	   	"mcr  p15,0,r0,c1,c0,0"		\
38*10465441SEvalZero 		:							\
39*10465441SEvalZero 		:"r" (bit)					\
40*10465441SEvalZero 		:"memory");
41*10465441SEvalZero }
42*10465441SEvalZero 
cache_disable(rt_uint32_t bit)43*10465441SEvalZero rt_inline void cache_disable(rt_uint32_t bit)
44*10465441SEvalZero {
45*10465441SEvalZero 	__asm__ __volatile__(			\
46*10465441SEvalZero 		"mrc  p15,0,r0,c1,c0,0\n\t"	\
47*10465441SEvalZero 		"bic  r0,r0,%0\n\t"			\
48*10465441SEvalZero 		"mcr  p15,0,r0,c1,c0,0"		\
49*10465441SEvalZero 		:							\
50*10465441SEvalZero 		:"r" (bit)					\
51*10465441SEvalZero 		:"memory");
52*10465441SEvalZero }
53*10465441SEvalZero #endif
54*10465441SEvalZero 
55*10465441SEvalZero #ifdef __CC_ARM
cp15_rd(void)56*10465441SEvalZero rt_inline rt_uint32_t cp15_rd(void)
57*10465441SEvalZero {
58*10465441SEvalZero 	rt_uint32_t i;
59*10465441SEvalZero 
60*10465441SEvalZero 	__asm
61*10465441SEvalZero 	{
62*10465441SEvalZero 		mrc p15, 0, i, c1, c0, 0
63*10465441SEvalZero 	}
64*10465441SEvalZero 
65*10465441SEvalZero 	return i;
66*10465441SEvalZero }
67*10465441SEvalZero 
cache_enable(rt_uint32_t bit)68*10465441SEvalZero rt_inline void cache_enable(rt_uint32_t bit)
69*10465441SEvalZero {
70*10465441SEvalZero 	rt_uint32_t value;
71*10465441SEvalZero 
72*10465441SEvalZero 	__asm
73*10465441SEvalZero 	{
74*10465441SEvalZero 		mrc p15, 0, value, c1, c0, 0
75*10465441SEvalZero 		orr value, value, bit
76*10465441SEvalZero 		mcr p15, 0, value, c1, c0, 0
77*10465441SEvalZero 	}
78*10465441SEvalZero }
79*10465441SEvalZero 
cache_disable(rt_uint32_t bit)80*10465441SEvalZero rt_inline void cache_disable(rt_uint32_t bit)
81*10465441SEvalZero {
82*10465441SEvalZero 	rt_uint32_t value;
83*10465441SEvalZero 
84*10465441SEvalZero 	__asm
85*10465441SEvalZero 	{
86*10465441SEvalZero 		mrc p15, 0, value, c1, c0, 0
87*10465441SEvalZero 		bic value, value, bit
88*10465441SEvalZero 		mcr p15, 0, value, c1, c0, 0
89*10465441SEvalZero 	}
90*10465441SEvalZero }
91*10465441SEvalZero #endif
92*10465441SEvalZero 
93*10465441SEvalZero /**
94*10465441SEvalZero  * enable I-Cache
95*10465441SEvalZero  *
96*10465441SEvalZero  */
rt_hw_cpu_icache_enable()97*10465441SEvalZero void rt_hw_cpu_icache_enable()
98*10465441SEvalZero {
99*10465441SEvalZero 	cache_enable(ICACHE_MASK);
100*10465441SEvalZero }
101*10465441SEvalZero 
102*10465441SEvalZero /**
103*10465441SEvalZero  * disable I-Cache
104*10465441SEvalZero  *
105*10465441SEvalZero  */
rt_hw_cpu_icache_disable()106*10465441SEvalZero void rt_hw_cpu_icache_disable()
107*10465441SEvalZero {
108*10465441SEvalZero 	cache_disable(ICACHE_MASK);
109*10465441SEvalZero }
110*10465441SEvalZero 
111*10465441SEvalZero /**
112*10465441SEvalZero  * return the status of I-Cache
113*10465441SEvalZero  *
114*10465441SEvalZero  */
rt_hw_cpu_icache_status()115*10465441SEvalZero rt_base_t rt_hw_cpu_icache_status()
116*10465441SEvalZero {
117*10465441SEvalZero 	return (cp15_rd() & ICACHE_MASK);
118*10465441SEvalZero }
119*10465441SEvalZero 
120*10465441SEvalZero /**
121*10465441SEvalZero  * enable D-Cache
122*10465441SEvalZero  *
123*10465441SEvalZero  */
rt_hw_cpu_dcache_enable()124*10465441SEvalZero void rt_hw_cpu_dcache_enable()
125*10465441SEvalZero {
126*10465441SEvalZero 	cache_enable(DCACHE_MASK);
127*10465441SEvalZero }
128*10465441SEvalZero 
129*10465441SEvalZero /**
130*10465441SEvalZero  * disable D-Cache
131*10465441SEvalZero  *
132*10465441SEvalZero  */
rt_hw_cpu_dcache_disable()133*10465441SEvalZero void rt_hw_cpu_dcache_disable()
134*10465441SEvalZero {
135*10465441SEvalZero 	cache_disable(DCACHE_MASK);
136*10465441SEvalZero }
137*10465441SEvalZero 
138*10465441SEvalZero /**
139*10465441SEvalZero  * return the status of D-Cache
140*10465441SEvalZero  *
141*10465441SEvalZero  */
rt_hw_cpu_dcache_status()142*10465441SEvalZero rt_base_t rt_hw_cpu_dcache_status()
143*10465441SEvalZero {
144*10465441SEvalZero 	return (cp15_rd() & DCACHE_MASK);
145*10465441SEvalZero }
146*10465441SEvalZero 
147*10465441SEvalZero /**
148*10465441SEvalZero  * reset cpu by dog's time-out
149*10465441SEvalZero  *
150*10465441SEvalZero  */
rt_hw_cpu_reset()151*10465441SEvalZero void rt_hw_cpu_reset()
152*10465441SEvalZero {
153*10465441SEvalZero 	/* Disable all interrupt except the WDT */
154*10465441SEvalZero 	INTMSK = (~((rt_uint32_t)1 << INTWDT));
155*10465441SEvalZero 
156*10465441SEvalZero 	/* Disable watchdog */
157*10465441SEvalZero 	WTCON = 0x0000;
158*10465441SEvalZero 
159*10465441SEvalZero 	/* Initialize watchdog timer count register */
160*10465441SEvalZero 	WTCNT = 0x0001;
161*10465441SEvalZero 
162*10465441SEvalZero 	/* Enable watchdog timer; assert reset at timer timeout */
163*10465441SEvalZero 	WTCON = 0x0021;
164*10465441SEvalZero 
165*10465441SEvalZero 	while(1);	/* loop forever and wait for reset to happen */
166*10465441SEvalZero 
167*10465441SEvalZero 	/* NEVER REACHED */
168*10465441SEvalZero }
169*10465441SEvalZero 
170*10465441SEvalZero /**
171*10465441SEvalZero  *  shutdown CPU
172*10465441SEvalZero  *
173*10465441SEvalZero  */
rt_hw_cpu_shutdown()174*10465441SEvalZero void rt_hw_cpu_shutdown()
175*10465441SEvalZero {
176*10465441SEvalZero 	rt_uint32_t level;
177*10465441SEvalZero 	rt_kprintf("shutdown...\n");
178*10465441SEvalZero 
179*10465441SEvalZero 	level = rt_hw_interrupt_disable();
180*10465441SEvalZero 	while (level)
181*10465441SEvalZero 	{
182*10465441SEvalZero 		RT_ASSERT(0);
183*10465441SEvalZero 	}
184*10465441SEvalZero }
185*10465441SEvalZero 
186*10465441SEvalZero /*@}*/
187