CV_MPU_ARMv7.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. static void ClearMpu(void) {
  13. for(uint32_t i = 0U; i < 8U; ++i) {
  14. MPU->RNR = i;
  15. MPU->RBAR = 0U;
  16. MPU->RASR = 0U;
  17. }
  18. }
  19. /*-----------------------------------------------------------------------------
  20. * Test cases
  21. *----------------------------------------------------------------------------*/
  22. /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
  23. /**
  24. \brief Test case: TC_MPU_SetClear
  25. \details
  26. - Check if ARM_MPU_Load correctly loads MPU table to registers.
  27. */
  28. void TC_MPU_SetClear(void)
  29. {
  30. static const ARM_MPU_Region_t table[] = {
  31. { .RBAR = 0U, .RASR = 0U },
  32. { .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) },
  33. { .RBAR = 0x50000000U, .RASR = ARM_MPU_RASR(0U, ARM_MPU_AP_FULL, 0U, 0U, 0U, 0U, 0U, ARM_MPU_REGION_SIZE_64MB) }
  34. };
  35. #define ASSERT_MPU_REGION(rnr, region) \
  36. MPU->RNR = rnr; \
  37. ASSERT_TRUE((MPU->RBAR & MPU_RBAR_ADDR_Msk) == (region.RBAR & MPU_RBAR_ADDR_Msk)); \
  38. ASSERT_TRUE(MPU->RASR == region.RASR)
  39. ClearMpu();
  40. ARM_MPU_SetRegion(table[1].RBAR, table[1].RASR);
  41. ASSERT_MPU_REGION(1U, table[0]);
  42. ASSERT_MPU_REGION(2U, table[1]);
  43. ASSERT_MPU_REGION(3U, table[0]);
  44. ARM_MPU_SetRegionEx(5U, table[2].RBAR, table[2].RASR);
  45. ASSERT_MPU_REGION(4U, table[0]);
  46. ASSERT_MPU_REGION(5U, table[2]);
  47. ASSERT_MPU_REGION(6U, table[0]);
  48. ARM_MPU_ClrRegion(5U);
  49. MPU->RNR = 5U;
  50. ASSERT_TRUE((MPU->RASR & MPU_RASR_ENABLE_Msk) == 0U);
  51. #undef ASSERT_MPU_REGION
  52. }
  53. /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
  54. /**
  55. \brief Test case: TC_MPU_Load
  56. \details
  57. - Check if ARM_MPU_Load correctly loads MPU table to registers.
  58. */
  59. void TC_MPU_Load(void)
  60. {
  61. static const ARM_MPU_Region_t table[] = {
  62. { .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) },
  63. { .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) },
  64. { .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) },
  65. { .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) },
  66. { .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) },
  67. { .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) },
  68. { .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) },
  69. { .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) }
  70. };
  71. #define ASSERT_MPU_REGION(rnr, table) \
  72. MPU->RNR = rnr; \
  73. ASSERT_TRUE((MPU->RBAR & MPU_RBAR_ADDR_Msk) == (table[rnr].RBAR & MPU_RBAR_ADDR_Msk)); \
  74. ASSERT_TRUE(MPU->RASR == table[rnr].RASR)
  75. ClearMpu();
  76. ARM_MPU_Load(&(table[0]), 1U);
  77. ASSERT_MPU_REGION(0U, table);
  78. ARM_MPU_Load(&(table[1]), 5U);
  79. ASSERT_MPU_REGION(0U, table);
  80. ASSERT_MPU_REGION(1U, table);
  81. ASSERT_MPU_REGION(2U, table);
  82. ASSERT_MPU_REGION(3U, table);
  83. ASSERT_MPU_REGION(4U, table);
  84. ASSERT_MPU_REGION(5U, table);
  85. ARM_MPU_Load(&(table[6]), 2U);
  86. ASSERT_MPU_REGION(5U, table);
  87. ASSERT_MPU_REGION(6U, table);
  88. ASSERT_MPU_REGION(7U, table);
  89. #undef ASSERT_MPU_REGION
  90. }