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