]> git.sur5r.net Git - freertos/blob - Demo/CORTEX_AT91SAM3U256_IAR/AT91Lib/peripherals/cp15/cp15.c
Start to re-arrange files to include FreeRTOS+ in main download.
[freertos] / Demo / CORTEX_AT91SAM3U256_IAR / AT91Lib / peripherals / cp15 / cp15.c
1 /* ----------------------------------------------------------------------------\r
2  *         ATMEL Microcontroller Software Support \r
3  * ----------------------------------------------------------------------------\r
4  * Copyright (c) 2008, Atmel Corporation\r
5  *\r
6  * All rights reserved.\r
7  *\r
8  * Redistribution and use in source and binary forms, with or without\r
9  * modification, are permitted provided that the following conditions are met:\r
10  *\r
11  * - Redistributions of source code must retain the above copyright notice,\r
12  * this list of conditions and the disclaimer below.\r
13  *\r
14  * Atmel's name may not be used to endorse or promote products derived from\r
15  * this software without specific prior written permission.\r
16  *\r
17  * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR\r
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE\r
20  * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,\r
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,\r
23  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
24  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r
25  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
26  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
27  * ----------------------------------------------------------------------------\r
28  */\r
29 \r
30 //-----------------------------------------------------------------------------\r
31 //         Headers\r
32 //-----------------------------------------------------------------------------\r
33 \r
34 #include <board.h>\r
35 \r
36 #ifdef CP15_PRESENT\r
37 \r
38 #include <utility/trace.h>\r
39 #include "cp15.h"\r
40 \r
41 #if defined(__ICCARM__)\r
42 #include <intrinsics.h>\r
43 #endif\r
44 \r
45 \r
46 //-----------------------------------------------------------------------------\r
47 //         Macros\r
48 //-----------------------------------------------------------------------------\r
49 \r
50 //-----------------------------------------------------------------------------\r
51 //         Defines\r
52 //-----------------------------------------------------------------------------\r
53 /*\r
54 #define CP15_RR_BIT 14 // RR bit Replacement strategy for ICache and DCache: \r
55                        // 0 = Random replacement \r
56                        // 1 = Round-robin replacement.\r
57                       \r
58 #define CP15_V_BIT  13 // V bit Location of exception vectors: \r
59                        // 0 = Normal exception vectors selected address range = 0x0000 0000 to 0x0000 001C \r
60                        // 1 = High exception vect selected, address range = 0xFFFF 0000 to 0xFFFF 001C\r
61 */                       \r
62 #define CP15_I_BIT  12 // I bit ICache enable/disable: \r
63                        // 0 = ICache disabled \r
64                        // 1 = ICache enabled\r
65 /*                       \r
66 #define CP15_R_BIT   9 // R bit ROM protection\r
67 \r
68 #define CP15_S_BIT   8 // S bit System protection\r
69                   \r
70 #define CP15_B_BIT   7 // B bit Endianness: \r
71                        // 0 = Little-endian operation \r
72                        // 1 = Big-endian operation.                  \r
73 */                     \r
74 #define CP15_C_BIT   2 // C bit DCache enable/disable: \r
75                        // 0 = Cache disabled \r
76                        // 1 = Cache enabled\r
77 /*\r
78 #define CP15_A_BIT   1 // A bit Alignment fault enable/disable:\r
79                        // 0 = Data address alignment fault checking disabled\r
80                        // 1 = Data address alignment fault checking enabled\r
81 */\r
82 #define CP15_M_BIT   0 // M bit MMU enable/disable: 0 = disabled 1 = enabled.\r
83                        // 0 = disabled \r
84                        // 1 = enabled\r
85 \r
86 \r
87 //-----------------------------------------------------------------------------\r
88 //         Global functions\r
89 //-----------------------------------------------------------------------------\r
90 \r
91 //------------------------------------------------------------------------------\r
92 /// Check Instruction Cache\r
93 /// \return 0 if I_Cache disable, 1 if I_Cache enable\r
94 //------------------------------------------------------------------------------\r
95 unsigned int CP15_Is_I_CacheEnabled(void)\r
96 {\r
97     unsigned int control;\r
98 \r
99     control = _readControlRegister();\r
100     return ((control & (1 << CP15_I_BIT)) != 0);\r
101\r
102 \r
103 //------------------------------------------------------------------------------\r
104 /// Enable Instruction Cache\r
105 //------------------------------------------------------------------------------\r
106 void CP15_Enable_I_Cache(void)\r
107 {\r
108     unsigned int control;\r
109 \r
110     control = _readControlRegister();\r
111 \r
112     // Check if cache is disabled\r
113     if ((control & (1 << CP15_I_BIT)) == 0) {\r
114 \r
115         control |= (1 << CP15_I_BIT);\r
116         _writeControlRegister(control);        \r
117         TRACE_INFO("I cache enabled.\n\r");\r
118     }\r
119 #if !defined(OP_BOOTSTRAP_on)\r
120     else {\r
121 \r
122         TRACE_INFO("I cache is already enabled.\n\r");\r
123     }\r
124 #endif\r
125 }\r
126 \r
127 //------------------------------------------------------------------------------\r
128 /// Disable Instruction Cache\r
129 //------------------------------------------------------------------------------\r
130 void CP15_Disable_I_Cache(void)\r
131 {\r
132     unsigned int control;\r
133 \r
134     control = _readControlRegister();\r
135 \r
136     // Check if cache is enabled\r
137     if ((control & (1 << CP15_I_BIT)) != 0) {\r
138 \r
139         control &= ~(1 << CP15_I_BIT);\r
140         _writeControlRegister(control);        \r
141         TRACE_INFO("I cache disabled.\n\r");\r
142     }\r
143     else {\r
144 \r
145         TRACE_INFO("I cache is already disabled.\n\r");\r
146     }\r
147\r
148 \r
149 //------------------------------------------------------------------------------\r
150 /// Check MMU\r
151 /// \return 0 if MMU disable, 1 if MMU enable\r
152 //------------------------------------------------------------------------------\r
153 unsigned int CP15_Is_MMUEnabled(void)\r
154 {\r
155     unsigned int control;\r
156 \r
157     control = _readControlRegister();\r
158     return ((control & (1 << CP15_M_BIT)) != 0);\r
159\r
160 \r
161 //------------------------------------------------------------------------------\r
162 /// Enable MMU\r
163 //------------------------------------------------------------------------------\r
164 void CP15_EnableMMU(void)\r
165 {\r
166     unsigned int control;\r
167 \r
168     control = _readControlRegister();\r
169 \r
170     // Check if MMU is disabled\r
171     if ((control & (1 << CP15_M_BIT)) == 0) {\r
172 \r
173         control |= (1 << CP15_M_BIT);\r
174         _writeControlRegister(control);        \r
175         TRACE_INFO("MMU enabled.\n\r");\r
176     }\r
177     else {\r
178 \r
179         TRACE_INFO("MMU is already enabled.\n\r");\r
180     }\r
181 }\r
182 \r
183 //------------------------------------------------------------------------------\r
184 /// Disable MMU\r
185 //------------------------------------------------------------------------------\r
186 void CP15_DisableMMU(void)\r
187 {\r
188     unsigned int control;\r
189 \r
190     control = _readControlRegister();\r
191 \r
192     // Check if MMU is enabled\r
193     if ((control & (1 << CP15_M_BIT)) != 0) {\r
194 \r
195         control &= ~(1 << CP15_M_BIT);\r
196         control &= ~(1 << CP15_C_BIT);\r
197         _writeControlRegister(control);        \r
198         TRACE_INFO("MMU disabled.\n\r");\r
199     }\r
200     else {\r
201 \r
202         TRACE_INFO("MMU is already disabled.\n\r");\r
203     }\r
204 }\r
205 \r
206 //------------------------------------------------------------------------------\r
207 /// Check D_Cache\r
208 /// \return 0 if D_Cache disable, 1 if D_Cache enable (with MMU of course)\r
209 //------------------------------------------------------------------------------\r
210 unsigned int CP15_Is_DCacheEnabled(void)\r
211 {\r
212     unsigned int control;\r
213 \r
214     control = _readControlRegister();\r
215     return ((control & ((1 << CP15_C_BIT)||(1 << CP15_M_BIT))) != 0);\r
216\r
217 \r
218 //------------------------------------------------------------------------------\r
219 /// Enable Data Cache\r
220 //------------------------------------------------------------------------------\r
221 void CP15_Enable_D_Cache(void)\r
222 {\r
223     unsigned int control;\r
224 \r
225     control = _readControlRegister();\r
226 \r
227     if( !CP15_Is_MMUEnabled() ) {\r
228         TRACE_ERROR("Do nothing: MMU not enabled\n\r");\r
229     }\r
230     else {\r
231         // Check if cache is disabled\r
232         if ((control & (1 << CP15_C_BIT)) == 0) {\r
233 \r
234             control |= (1 << CP15_C_BIT);\r
235             _writeControlRegister(control);        \r
236             TRACE_INFO("D cache enabled.\n\r");\r
237         }\r
238         else {\r
239 \r
240             TRACE_INFO("D cache is already enabled.\n\r");\r
241         }\r
242     }\r
243 }\r
244 \r
245 //------------------------------------------------------------------------------\r
246 /// Disable Data Cache\r
247 //------------------------------------------------------------------------------\r
248 void CP15_Disable_D_Cache(void)\r
249 {\r
250     unsigned int control;\r
251 \r
252     control = _readControlRegister();\r
253 \r
254     // Check if cache is enabled\r
255     if ((control & (1 << CP15_C_BIT)) != 0) {\r
256 \r
257         control &= ~(1 << CP15_C_BIT);\r
258         _writeControlRegister(control);        \r
259         TRACE_INFO("D cache disabled.\n\r");\r
260     }\r
261     else {\r
262 \r
263         TRACE_INFO("D cache is already disabled.\n\r");\r
264     }\r
265 }\r
266 \r
267 #endif // CP15_PRESENT\r
268 \r