CV_MPU_ARMv7.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /*-----------------------------------------------------------------------------
  2. * Name: CV_MPU_ARMv7.c
  3. * Purpose: CMSIS CORE validation tests implementation
  4. *-----------------------------------------------------------------------------
  5. * Copyright (c) 2017 ARM Limited. All rights reserved.
  6. *----------------------------------------------------------------------------*/
  7. #include "CV_Framework.h"
  8. #include "cmsis_cv.h"
  9. /*-----------------------------------------------------------------------------
  10. * Test implementation
  11. *----------------------------------------------------------------------------*/
  12. #if defined(__MPU_PRESENT) && __MPU_PRESENT
  13. static void ClearMpu(void) {
  14. for(uint32_t i = 0U; i < 8U; ++i) {
  15. MPU->RNR = i;
  16. MPU->RBAR = 0U;
  17. MPU->RASR = 0U;
  18. }
  19. }
  20. #endif
  21. /*-----------------------------------------------------------------------------
  22. * Test cases
  23. *----------------------------------------------------------------------------*/
  24. /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
  25. /**
  26. \brief Test case: TC_MPU_SetClear
  27. \details
  28. - Check if ARM_MPU_Load correctly loads MPU table to registers.
  29. */
  30. void TC_MPU_SetClear(void)
  31. {
  32. #if defined(__MPU_PRESENT) && __MPU_PRESENT
  33. static const ARM_MPU_Region_t table[] = {
  34. { .RBAR = 0U, .RASR = 0U },
  35. { .RBAR = ARM_MPU_RBAR(2U, 0x30000000U), .RASR = ARM_MPU_RASR(1U, ARM_MPU_AP_FULL, 0U, 0U, 0U, 0U, 0U, ARM_MPU_REGION_SIZE_128MB) },
  36. { .RBAR = 0x50000000U, .RASR = ARM_MPU_RASR(0U, ARM_MPU_AP_FULL, 0U, 0U, 0U, 0U, 0U, ARM_MPU_REGION_SIZE_64MB) }
  37. };
  38. #define ASSERT_MPU_REGION(rnr, region) \
  39. MPU->RNR = rnr; \
  40. ASSERT_TRUE((MPU->RBAR & MPU_RBAR_ADDR_Msk) == (region.RBAR & MPU_RBAR_ADDR_Msk)); \
  41. ASSERT_TRUE(MPU->RASR == region.RASR)
  42. ClearMpu();
  43. ARM_MPU_SetRegion(table[1].RBAR, table[1].RASR);
  44. ASSERT_MPU_REGION(1U, table[0]);
  45. ASSERT_MPU_REGION(2U, table[1]);
  46. ASSERT_MPU_REGION(3U, table[0]);
  47. ARM_MPU_SetRegionEx(5U, table[2].RBAR, table[2].RASR);
  48. ASSERT_MPU_REGION(4U, table[0]);
  49. ASSERT_MPU_REGION(5U, table[2]);
  50. ASSERT_MPU_REGION(6U, table[0]);
  51. ARM_MPU_ClrRegion(5U);
  52. MPU->RNR = 5U;
  53. ASSERT_TRUE((MPU->RASR & MPU_RASR_ENABLE_Msk) == 0U);
  54. #undef ASSERT_MPU_REGION
  55. #endif
  56. }
  57. /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
  58. /**
  59. \brief Test case: TC_MPU_Load
  60. \details
  61. - Check if ARM_MPU_Load correctly loads MPU table to registers.
  62. */
  63. void TC_MPU_Load(void)
  64. {
  65. #if defined(__MPU_PRESENT) && __MPU_PRESENT
  66. static const ARM_MPU_Region_t table[] = {
  67. { .RBAR = ARM_MPU_RBAR(0U, 0x10000000U), .RASR = ARM_MPU_RASR(1U, ARM_MPU_AP_FULL, 0U, 0U, 0U, 0U, 0U, ARM_MPU_REGION_SIZE_32MB) },
  68. { .RBAR = ARM_MPU_RBAR(1U, 0x20000000U), .RASR = ARM_MPU_RASR(1U, ARM_MPU_AP_FULL, 0U, 0U, 0U, 0U, 0U, ARM_MPU_REGION_SIZE_64MB) },
  69. { .RBAR = ARM_MPU_RBAR(2U, 0x30000000U), .RASR = ARM_MPU_RASR(1U, ARM_MPU_AP_FULL, 0U, 0U, 0U, 0U, 0U, ARM_MPU_REGION_SIZE_128MB) },
  70. { .RBAR = ARM_MPU_RBAR(3U, 0x40000000U), .RASR = ARM_MPU_RASR(1U, ARM_MPU_AP_FULL, 0U, 0U, 0U, 0U, 0U, ARM_MPU_REGION_SIZE_256MB) },
  71. { .RBAR = ARM_MPU_RBAR(4U, 0x50000000U), .RASR = ARM_MPU_RASR(1U, ARM_MPU_AP_FULL, 0U, 0U, 0U, 0U, 0U, ARM_MPU_REGION_SIZE_512MB) },
  72. { .RBAR = ARM_MPU_RBAR(5U, 0x60000000U), .RASR = ARM_MPU_RASR(1U, ARM_MPU_AP_FULL, 0U, 0U, 0U, 0U, 0U, ARM_MPU_REGION_SIZE_16MB) },
  73. { .RBAR = ARM_MPU_RBAR(6U, 0x70000000U), .RASR = ARM_MPU_RASR(1U, ARM_MPU_AP_FULL, 0U, 0U, 0U, 0U, 0U, ARM_MPU_REGION_SIZE_8MB) },
  74. { .RBAR = ARM_MPU_RBAR(7U, 0x80000000U), .RASR = ARM_MPU_RASR(1U, ARM_MPU_AP_FULL, 0U, 0U, 0U, 0U, 0U, ARM_MPU_REGION_SIZE_4MB) }
  75. };
  76. #define ASSERT_MPU_REGION(rnr, table) \
  77. MPU->RNR = rnr; \
  78. ASSERT_TRUE((MPU->RBAR & MPU_RBAR_ADDR_Msk) == (table[rnr].RBAR & MPU_RBAR_ADDR_Msk)); \
  79. ASSERT_TRUE(MPU->RASR == table[rnr].RASR)
  80. ClearMpu();
  81. ARM_MPU_Load(&(table[0]), 1U);
  82. ASSERT_MPU_REGION(0U, table);
  83. ARM_MPU_Load(&(table[1]), 5U);
  84. ASSERT_MPU_REGION(0U, table);
  85. ASSERT_MPU_REGION(1U, table);
  86. ASSERT_MPU_REGION(2U, table);
  87. ASSERT_MPU_REGION(3U, table);
  88. ASSERT_MPU_REGION(4U, table);
  89. ASSERT_MPU_REGION(5U, table);
  90. ARM_MPU_Load(&(table[6]), 2U);
  91. ASSERT_MPU_REGION(5U, table);
  92. ASSERT_MPU_REGION(6U, table);
  93. ASSERT_MPU_REGION(7U, table);
  94. #undef ASSERT_MPU_REGION
  95. #endif
  96. }