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