1*10465441SEvalZero /*
2*10465441SEvalZero * File : cpu.c
3*10465441SEvalZero * This file is part of RT-Thread RTOS
4*10465441SEvalZero * COPYRIGHT (C) 2006 - 2013, RT-Thread Development Team
5*10465441SEvalZero *
6*10465441SEvalZero * This program is free software; you can redistribute it and/or modify
7*10465441SEvalZero * it under the terms of the GNU General Public License as published by
8*10465441SEvalZero * the Free Software Foundation; either version 2 of the License, or
9*10465441SEvalZero * (at your option) any later version.
10*10465441SEvalZero *
11*10465441SEvalZero * This program is distributed in the hope that it will be useful,
12*10465441SEvalZero * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*10465441SEvalZero * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14*10465441SEvalZero * GNU General Public License for more details.
15*10465441SEvalZero *
16*10465441SEvalZero * You should have received a copy of the GNU General Public License along
17*10465441SEvalZero * with this program; if not, write to the Free Software Foundation, Inc.,
18*10465441SEvalZero * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19*10465441SEvalZero *
20*10465441SEvalZero * Change Logs:
21*10465441SEvalZero * Date Author Notes
22*10465441SEvalZero * 2013-7-14 Peng Fan sep6200 implementation
23*10465441SEvalZero */
24*10465441SEvalZero
25*10465441SEvalZero #include <rthw.h>
26*10465441SEvalZero #include <rtthread.h>
27*10465441SEvalZero #include <sep6200.h>
28*10465441SEvalZero
29*10465441SEvalZero /**
30*10465441SEvalZero * @addtogroup sep6200
31*10465441SEvalZero */
32*10465441SEvalZero /*@{*/
33*10465441SEvalZero
34*10465441SEvalZero #ifdef __GNUC__
cache_invalid(void)35*10465441SEvalZero rt_inline void cache_invalid(void)
36*10465441SEvalZero {
37*10465441SEvalZero __asm__ volatile ("movc p0.c5, r1, #28\n"
38*10465441SEvalZero "nop;nop;nop;nop;nop;nop;nop;nop;\n"
39*10465441SEvalZero :
40*10465441SEvalZero :
41*10465441SEvalZero :"memory", "cc"
42*10465441SEvalZero );
43*10465441SEvalZero }
44*10465441SEvalZero
cache_enable(void)45*10465441SEvalZero rt_inline void cache_enable(void)
46*10465441SEvalZero {
47*10465441SEvalZero __asm__ volatile ( "movc r1, p0.c1, #0\n"
48*10465441SEvalZero "or r1, r1, #0xc\n"
49*10465441SEvalZero "movc p0.c1, r1, #0\n"
50*10465441SEvalZero "nop;nop;nop;nop;nop;nop;nop;nop;\n"
51*10465441SEvalZero :
52*10465441SEvalZero :
53*10465441SEvalZero :"r0", "memory", "cc");
54*10465441SEvalZero }
55*10465441SEvalZero
clean_dcache(void)56*10465441SEvalZero rt_inline void clean_dcache(void)
57*10465441SEvalZero {
58*10465441SEvalZero __asm__ volatile ( "mov ip, #0\n"
59*10465441SEvalZero "movc p0.c5, ip, #10\n"
60*10465441SEvalZero "nop; nop; nop; nop; nop; nop; nop; nop\n"
61*10465441SEvalZero :
62*10465441SEvalZero :
63*10465441SEvalZero :"ip", "memory", "cc");
64*10465441SEvalZero }
65*10465441SEvalZero
icache_status(void)66*10465441SEvalZero rt_inline rt_uint32_t icache_status(void)
67*10465441SEvalZero {
68*10465441SEvalZero rt_uint32_t ret;
69*10465441SEvalZero
70*10465441SEvalZero __asm__ volatile ( "movc %0, p0.c1, #0\n"
71*10465441SEvalZero "and %0, %0, #8\n"
72*10465441SEvalZero : "=&r" (ret)
73*10465441SEvalZero :
74*10465441SEvalZero :"memory", "cc");
75*10465441SEvalZero
76*10465441SEvalZero return ret;
77*10465441SEvalZero }
78*10465441SEvalZero
dcache_status(void)79*10465441SEvalZero rt_inline rt_uint32_t dcache_status(void)
80*10465441SEvalZero {
81*10465441SEvalZero rt_uint32_t ret;
82*10465441SEvalZero
83*10465441SEvalZero __asm__ volatile ( "movc %0, p0.c1, #0\n"
84*10465441SEvalZero "and %0, %0, #4\n"
85*10465441SEvalZero : "=&r" (ret)
86*10465441SEvalZero :
87*10465441SEvalZero :"memory", "cc");
88*10465441SEvalZero
89*10465441SEvalZero return ret;
90*10465441SEvalZero }
91*10465441SEvalZero
dcache_flush(void)92*10465441SEvalZero rt_inline void dcache_flush(void)
93*10465441SEvalZero {
94*10465441SEvalZero __asm__ volatile ( "mov ip, #0\n"
95*10465441SEvalZero "movc p0.c5, ip, #14\n"
96*10465441SEvalZero "nop; nop; nop; nop; nop; nop; nop; nop\n"
97*10465441SEvalZero :
98*10465441SEvalZero :
99*10465441SEvalZero : "ip" );
100*10465441SEvalZero }
101*10465441SEvalZero
icache_invalid(void)102*10465441SEvalZero rt_inline void icache_invalid(void)
103*10465441SEvalZero {
104*10465441SEvalZero __asm__ volatile ( "mov r0, #0\n"
105*10465441SEvalZero "movc p0.c5, r0, #20\n"
106*10465441SEvalZero "nop; nop; nop; nop; nop; nop; nop; nop\n"
107*10465441SEvalZero :
108*10465441SEvalZero :
109*10465441SEvalZero :"r0", "memory", "cc");
110*10465441SEvalZero }
111*10465441SEvalZero
dcache_invalid(void)112*10465441SEvalZero rt_inline void dcache_invalid(void)
113*10465441SEvalZero {
114*10465441SEvalZero __asm__ volatile ( "mov r0, #0\n"
115*10465441SEvalZero "movc p0.c5, r0, #12\n"
116*10465441SEvalZero "nop; nop; nop; nop; nop; nop; nop; nop\n"
117*10465441SEvalZero :
118*10465441SEvalZero :
119*10465441SEvalZero :"r0", "memory", "cc");
120*10465441SEvalZero }
121*10465441SEvalZero
icache_disable(void)122*10465441SEvalZero rt_inline void icache_disable(void)
123*10465441SEvalZero {
124*10465441SEvalZero icache_invalid();
125*10465441SEvalZero __asm__ volatile ( "movc r0, p0.c1, #0\n"
126*10465441SEvalZero "andn r0, r0, #8\n"
127*10465441SEvalZero "movc p0.c1, r0, #0\n"
128*10465441SEvalZero :
129*10465441SEvalZero :
130*10465441SEvalZero :"r0", "memory", "cc");
131*10465441SEvalZero }
132*10465441SEvalZero
dcache_disable(void)133*10465441SEvalZero rt_inline void dcache_disable(void)
134*10465441SEvalZero {
135*10465441SEvalZero dcache_flush();
136*10465441SEvalZero __asm__ volatile ( "movc r0, p0.c1, #0\n"
137*10465441SEvalZero "andn r0, r0, #20\n"
138*10465441SEvalZero "movc p0.c1, r0, #0\n"
139*10465441SEvalZero :
140*10465441SEvalZero :
141*10465441SEvalZero :"r0", "memory", "cc");
142*10465441SEvalZero
143*10465441SEvalZero }
144*10465441SEvalZero
icache_enable(void)145*10465441SEvalZero rt_inline void icache_enable(void)
146*10465441SEvalZero {
147*10465441SEvalZero __asm__ volatile ( "mov r0, #0\n"
148*10465441SEvalZero "movc p0.c5, r0, #20\n"
149*10465441SEvalZero "nop; nop; nop; nop; nop; nop; nop; nop\n"
150*10465441SEvalZero :
151*10465441SEvalZero :
152*10465441SEvalZero :"r0", "memory", "cc");
153*10465441SEvalZero
154*10465441SEvalZero __asm__ volatile ( "movc r0, p0.c1, #0\n"
155*10465441SEvalZero "or r0, r0, #8\n"
156*10465441SEvalZero "movc p0.c1, r0, #0\n"
157*10465441SEvalZero :
158*10465441SEvalZero :
159*10465441SEvalZero :"r0", "memory", "cc");
160*10465441SEvalZero }
161*10465441SEvalZero
dcache_enable(void)162*10465441SEvalZero rt_inline void dcache_enable(void)
163*10465441SEvalZero {
164*10465441SEvalZero __asm__ volatile ( "mov r0, #0\n"
165*10465441SEvalZero "movc p0.c5, r0, #12\n"
166*10465441SEvalZero "nop; nop; nop; nop; nop; nop; nop; nop\n"
167*10465441SEvalZero :
168*10465441SEvalZero :
169*10465441SEvalZero :"r0", "memory", "cc");
170*10465441SEvalZero
171*10465441SEvalZero __asm__ volatile ( "movc r0, p0.c1, #0\n"
172*10465441SEvalZero "or r0, r0, #20\n"
173*10465441SEvalZero "movc p0.c1, r0, #0\n"
174*10465441SEvalZero :
175*10465441SEvalZero :
176*10465441SEvalZero :"r0", "memory", "cc");
177*10465441SEvalZero }
178*10465441SEvalZero #endif
179*10465441SEvalZero
180*10465441SEvalZero
181*10465441SEvalZero /**
182*10465441SEvalZero * enable I-Cache
183*10465441SEvalZero *
184*10465441SEvalZero */
rt_hw_cpu_icache_enable()185*10465441SEvalZero void rt_hw_cpu_icache_enable()
186*10465441SEvalZero {
187*10465441SEvalZero icache_enable();
188*10465441SEvalZero }
189*10465441SEvalZero
190*10465441SEvalZero /**
191*10465441SEvalZero * disable I-Cache
192*10465441SEvalZero *
193*10465441SEvalZero */
rt_hw_cpu_icache_disable()194*10465441SEvalZero void rt_hw_cpu_icache_disable()
195*10465441SEvalZero {
196*10465441SEvalZero icache_disable();
197*10465441SEvalZero }
198*10465441SEvalZero
199*10465441SEvalZero /**
200*10465441SEvalZero * return the status of I-Cache
201*10465441SEvalZero *
202*10465441SEvalZero */
rt_hw_cpu_icache_status()203*10465441SEvalZero rt_base_t rt_hw_cpu_icache_status()
204*10465441SEvalZero {
205*10465441SEvalZero return icache_status();
206*10465441SEvalZero }
207*10465441SEvalZero
208*10465441SEvalZero /**
209*10465441SEvalZero * enable D-Cache
210*10465441SEvalZero *
211*10465441SEvalZero */
rt_hw_cpu_dcache_enable()212*10465441SEvalZero void rt_hw_cpu_dcache_enable()
213*10465441SEvalZero {
214*10465441SEvalZero dcache_enable();
215*10465441SEvalZero }
216*10465441SEvalZero
217*10465441SEvalZero /**
218*10465441SEvalZero * disable D-Cache
219*10465441SEvalZero *
220*10465441SEvalZero */
rt_hw_cpu_dcache_disable()221*10465441SEvalZero void rt_hw_cpu_dcache_disable()
222*10465441SEvalZero {
223*10465441SEvalZero dcache_disable();
224*10465441SEvalZero }
225*10465441SEvalZero
226*10465441SEvalZero /**
227*10465441SEvalZero * return the status of D-Cache
228*10465441SEvalZero *
229*10465441SEvalZero */
rt_hw_cpu_dcache_status()230*10465441SEvalZero rt_base_t rt_hw_cpu_dcache_status()
231*10465441SEvalZero {
232*10465441SEvalZero return dcache_status();
233*10465441SEvalZero }
234*10465441SEvalZero
sep6200_reset(rt_uint32_t addr)235*10465441SEvalZero static void sep6200_reset(rt_uint32_t addr)
236*10465441SEvalZero {
237*10465441SEvalZero __asm__ volatile ( "mov ip, #0\n"
238*10465441SEvalZero "movc p0.c5, ip, #28\n" /*Cache invalidate all*/
239*10465441SEvalZero "movc p0.c6, ip, #6\n" /*TLB invalidate all*/
240*10465441SEvalZero "nop;nop;nop;nop;nop;nop;nop;nop;\n"
241*10465441SEvalZero "movc ip, p0.c1, #0\n" /*ctrl register*/
242*10465441SEvalZero "andn ip, ip, #0x000f\n" /*disable caches and mmu*/
243*10465441SEvalZero "movc p0.c1, ip, #0\n"
244*10465441SEvalZero "nop\n"
245*10465441SEvalZero "mov pc, %0\n"
246*10465441SEvalZero "nop;nop;nop;nop;nop;nop;nop;nop;\n"
247*10465441SEvalZero : "=&r" (addr)
248*10465441SEvalZero :
249*10465441SEvalZero :"memory", "cc");
250*10465441SEvalZero }
251*10465441SEvalZero
sep6200_poweroff(void)252*10465441SEvalZero static void sep6200_poweroff(void)
253*10465441SEvalZero {
254*10465441SEvalZero rt_kprintf("sep6200 power off not implemented\n");
255*10465441SEvalZero while(1);
256*10465441SEvalZero }
257*10465441SEvalZero
258*10465441SEvalZero /**
259*10465441SEvalZero * reset cpu by dog's time-out
260*10465441SEvalZero *
261*10465441SEvalZero */
rt_hw_cpu_reset()262*10465441SEvalZero void rt_hw_cpu_reset()
263*10465441SEvalZero {
264*10465441SEvalZero
265*10465441SEvalZero rt_kprintf("Soft reset, Restarting system...\n");
266*10465441SEvalZero sep6200_reset(0);
267*10465441SEvalZero
268*10465441SEvalZero while(1); /* loop forever and wait for reset to happen */
269*10465441SEvalZero
270*10465441SEvalZero /* NEVER REACHED */
271*10465441SEvalZero }
272*10465441SEvalZero
273*10465441SEvalZero /**
274*10465441SEvalZero * shutdown CPU
275*10465441SEvalZero *
276*10465441SEvalZero */
rt_hw_cpu_shutdown()277*10465441SEvalZero void rt_hw_cpu_shutdown()
278*10465441SEvalZero {
279*10465441SEvalZero rt_uint32_t level;
280*10465441SEvalZero rt_kprintf("shutdown...\n");
281*10465441SEvalZero
282*10465441SEvalZero level = rt_hw_interrupt_disable();
283*10465441SEvalZero sep6200_poweroff();
284*10465441SEvalZero while (level)
285*10465441SEvalZero {
286*10465441SEvalZero RT_ASSERT(0);
287*10465441SEvalZero }
288*10465441SEvalZero }
289*10465441SEvalZero
290*10465441SEvalZero /*@}*/
291