test_4mpsram.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /*
  2. * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "esp_heap_caps.h"
  7. #include "unity.h"
  8. #include "esp_log.h"
  9. #include "esp_private/spi_common_internal.h"
  10. #include "sdkconfig.h"
  11. #if CONFIG_IDF_TARGET_ESP32
  12. static const char TAG[] = "test_psram";
  13. #ifdef CONFIG_SPIRAM
  14. static void test_psram_content(void)
  15. {
  16. const int test_size = 2048;
  17. uint32_t *test_area = heap_caps_malloc(test_size, MALLOC_CAP_SPIRAM);
  18. size_t p;
  19. size_t s = test_size;
  20. int errct = 0;
  21. int initial_err = -1;
  22. for (p = 0; p < (s / sizeof(int)); p += 4) {
  23. test_area[p] = p ^ 0xAAAAAAAA;
  24. }
  25. for (p = 0; p < (s / sizeof(int)); p += 4) {
  26. if (test_area[p] != (p ^ 0xAAAAAAAA)) {
  27. errct++;
  28. if (errct == 1) {
  29. initial_err = p * 4;
  30. }
  31. }
  32. }
  33. if (errct) {
  34. ESP_LOGE(TAG, "SPI SRAM memory test fail. %d/%d writes failed, first @ %p", errct, s / 32, initial_err + test_area);
  35. TEST_FAIL();
  36. } else {
  37. ESP_LOGI(TAG, "SPI SRAM memory test OK");
  38. }
  39. free(test_area);
  40. }
  41. #endif
  42. bool psram_is_32mbit_ver0(void);
  43. static void test_spi_bus_occupy(spi_host_device_t expected_occupied_host)
  44. {
  45. bool claim_hspi = spicommon_periph_claim(HSPI_HOST, "ut-hspi");
  46. if (claim_hspi) {
  47. ESP_LOGI(TAG, "HSPI claimed.");
  48. }
  49. bool claim_vspi = spicommon_periph_claim(VSPI_HOST, "ut-vspi");
  50. if (claim_vspi) {
  51. ESP_LOGI(TAG, "VSPI claimed.");
  52. }
  53. if (expected_occupied_host == HSPI_HOST) {
  54. TEST_ASSERT_FALSE(claim_hspi);
  55. TEST_ASSERT(claim_vspi);
  56. } else if (expected_occupied_host == VSPI_HOST) {
  57. TEST_ASSERT_FALSE(claim_vspi);
  58. TEST_ASSERT(claim_hspi);
  59. } else {
  60. TEST_ASSERT(claim_hspi);
  61. TEST_ASSERT(claim_vspi);
  62. }
  63. #ifdef CONFIG_SPIRAM
  64. test_psram_content();
  65. #endif
  66. }
  67. #if CONFIG_SPIRAM_OCCUPY_HSPI_HOST || CONFIG_SPIRAM_OCCUPY_VSPI_HOST
  68. TEST_CASE("some spi bus occpied by psram", "[psram_4m]")
  69. {
  70. // NOTE: this unit test rely on the config that PSRAM of 8MB is used only when CONFIG_SPIRAM_BANKSWITCH_ENABLE is set
  71. //currently all 8M psram don't need more SPI peripherals
  72. #if !CONFIG_SPIRAM || !CONFIG_SPIRAM_SPEED_80M || CONFIG_SPIRAM_BANKSWITCH_ENABLE
  73. #error unexpected test config, only psram 32MBit ver 0 at 80MHz will trigger the workaround
  74. #endif
  75. spi_host_device_t host;
  76. if (!psram_is_32mbit_ver0()) {
  77. TEST_FAIL_MESSAGE("unexpected psram version");
  78. }
  79. #if CONFIG_SPIRAM_OCCUPY_HSPI_HOST
  80. host = HSPI_HOST;
  81. #elif CONFIG_SPIRAM_OCCUPY_VSPI_HOST
  82. host = VSPI_HOST;
  83. #endif
  84. test_spi_bus_occupy(host);
  85. }
  86. #else
  87. TEST_CASE("can use spi when not being used by psram", "[psram_4m]")
  88. {
  89. #if CONFIG_SPIRAM && CONFIG_SPIRAM_SPEED_80M
  90. #error unexpected test config, some runners using the UT_T1_PSRAMV0 but still perform this test.\
  91. they will not pass this test at 80MHz.
  92. #endif
  93. test_spi_bus_occupy(-1);
  94. }
  95. #endif
  96. #endif // CONFIG_IDF_TARGET_ESP32