]> granicus.if.org Git - esp-idf/commitdiff
spi_flash: Add spi_flash_cache_enabled() test function
authorAngus Gratton <angus@espressif.com>
Thu, 2 Mar 2017 04:21:03 +0000 (15:21 +1100)
committerAngus Gratton <angus@espressif.com>
Fri, 3 Mar 2017 04:33:23 +0000 (15:33 +1100)
components/spi_flash/cache_utils.c
components/spi_flash/include/esp_spi_flash.h
components/spi_flash/test/test_cache_disabled.c [new file with mode: 0644]
docs/api/storage/spi_flash.rst

index 5e880ab493e6413adaf72c194fa99c6c4bb06b22..6d0dd91845edabb48190ac4279f8ad6c2b1d5a71 100644 (file)
@@ -275,3 +275,9 @@ static void IRAM_ATTR spi_flash_restore_cache(uint32_t cpuid, uint32_t saved_sta
     }
 }
 
+
+IRAM_ATTR bool spi_flash_cache_enabled()
+{
+    return REG_GET_BIT(DPORT_PRO_CACHE_CTRL_REG, DPORT_PRO_CACHE_ENABLE)
+        && REG_GET_BIT(DPORT_APP_CACHE_CTRL_REG, DPORT_APP_CACHE_ENABLE);
+}
index 40720af38b20983c28637a78abefd8dfb12d791e..00797b8df25ff4c1ee6e8ecd12e9775f1f0a63f1 100644 (file)
@@ -233,6 +233,12 @@ size_t spi_flash_cache2phys(const void *cached);
  */
 const void *spi_flash_phys2cache(size_t phys_offs, spi_flash_mmap_memory_t memory);
 
+/** @brief Check at runtime if flash cache is enabled on both CPUs
+ *
+ * @return true if both CPUs have flash cache enabled, false otherwise.
+ */
+bool spi_flash_cache_enabled();
+
 /**
  * @brief SPI flash critical section enter function.
  */
diff --git a/components/spi_flash/test/test_cache_disabled.c b/components/spi_flash/test/test_cache_disabled.c
new file mode 100644 (file)
index 0000000..8caa7e8
--- /dev/null
@@ -0,0 +1,53 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freertos/FreeRTOS.h>
+#include <freertos/task.h>
+#include <freertos/semphr.h>
+
+#include <unity.h>
+#include <esp_spi_flash.h>
+#include <esp_attr.h>
+#include <esp_flash_encrypt.h>
+
+#include "../cache_utils.h"
+
+static QueueHandle_t result_queue;
+
+static IRAM_ATTR void cache_test_task(void *arg)
+{
+    bool do_disable = (bool)arg;
+    bool result;
+    if(do_disable) {
+        spi_flash_disable_interrupts_caches_and_other_cpu();
+    }
+    result = spi_flash_cache_enabled();
+    if (do_disable) {
+        spi_flash_enable_interrupts_caches_and_other_cpu();
+    }
+
+    TEST_ASSERT( xQueueSendToBack(result_queue, &result, 0) );
+    vTaskDelete(NULL);
+}
+
+TEST_CASE("spi_flash_cache_enabled() works on both CPUs", "[spi_flash]")
+{
+    result_queue = xQueueCreate(1, sizeof(bool));
+
+    for(int cpu = 0; cpu < portNUM_PROCESSORS; cpu++) {
+        for(int disable = 0; disable <= 1; disable++) {
+            bool do_disable = disable;
+            bool result;
+            printf("Testing cpu %d disabled %d\n", cpu, do_disable);
+
+            xTaskCreatePinnedToCore(cache_test_task, "cache_check_task",
+                                    2048, (void *)do_disable, configMAX_PRIORITIES-1, NULL, cpu);
+
+            TEST_ASSERT( xQueueReceive(result_queue, &result, 2) );
+            TEST_ASSERT_EQUAL(!do_disable, result);
+        }
+    }
+
+    vQueueDelete(result_queue);
+}
+
index 4bf5e37a99efe4c53fa527540186bdaff0de2ced..c42aedb4b0e7e4d1b202f4140385e54e86b1bba9 100644 (file)
@@ -62,6 +62,7 @@ Functions
 .. doxygenfunction:: spi_flash_mmap_dump
 .. doxygenfunction:: spi_flash_cache2phys
 .. doxygenfunction:: spi_flash_phys2cache
+.. doxygenfunction:: spi_flash_cache_enabled
 .. doxygenfunction:: esp_partition_find
 .. doxygenfunction:: esp_partition_find_first
 .. doxygenfunction:: esp_partition_get