cp15.c
上传用户:xukun0987
上传日期:2022-07-16
资源大小:216k
文件大小:9k
源码类别:

微处理器开发

开发平台:

C/C++

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