]> granicus.if.org Git - esp-idf/commitdiff
flash_ops: fix spi_flash_read with source buffer not from internal memory and size...
authorAjita Chavan <ajita.chavan@espressif.com>
Sat, 19 Oct 2019 06:56:43 +0000 (14:56 +0800)
committerMahavir Jain <mahavir@espressif.com>
Sat, 19 Oct 2019 06:56:43 +0000 (14:56 +0800)
Closes https://github.com/espressif/esp-idf/issues/4010

components/spi_flash/flash_ops.c
components/spi_flash/test/CMakeLists.txt
components/spi_flash/test/component.mk
components/spi_flash/test/test_read_write.c
tools/ci/config/target-test.yml
tools/unit-test-app/configs/spi_flash_legacy [new file with mode: 0644]

index 1c5406a1c34f906f21c1742a578a471265eeade0..6e61da87dea486a1f0b589bd049d65a6a3f1c367 100644 (file)
@@ -513,7 +513,17 @@ esp_err_t IRAM_ATTR spi_flash_read(size_t src, void *dstv, size_t size)
             goto out;
         }
         COUNTER_ADD_BYTES(read, read_size);
+#ifdef ESP_PLATFORM
+        if (esp_ptr_external_ram(dstv)) {
+            spi_flash_guard_end();
+            memcpy(dstv, ((uint8_t *) t) + left_off, size);
+            spi_flash_guard_start();
+        } else {
+            memcpy(dstv, ((uint8_t *) t) + left_off, size);
+        }
+#else
         memcpy(dstv, ((uint8_t *) t) + left_off, size);
+#endif
         goto out;
     }
     uint8_t *dstc = (uint8_t *) dstv;
index ae23154f2f4dc6bf823e4e5fdbd65f33f3ed2b6f..831e14212073b58ba757211c2f78f4043ee66f71 100644 (file)
@@ -1,3 +1,7 @@
 idf_component_register(SRC_DIRS "."
                     INCLUDE_DIRS "."
-                    REQUIRES unity test_utils spi_flash bootloader_support app_update)
\ No newline at end of file
+                    REQUIRES unity test_utils spi_flash bootloader_support app_update)
+
+if(CONFIG_SPI_FLASH_USE_LEGACY_IMPL)
+    set(COMPONENT_SRCEXCLUDE "test_esp_flash.c" "test_partition_ext.c")
+endif()
index 5dd172bdb741ac981aca2ac446a56e62733f816a..2a236e9d0343880a5e7930b5aac688f49be4aa57 100644 (file)
@@ -3,3 +3,7 @@
 #
 
 COMPONENT_ADD_LDFLAGS = -Wl,--whole-archive -l$(COMPONENT_NAME) -Wl,--no-whole-archive
+
+ifdef CONFIG_SPI_FLASH_USE_LEGACY_IMPL
+       COMPONENT_OBJEXCLUDE += test_esp_flash.o test_partition_ext.o
+endif
index e780b6e2fe728517cebcc0ecaa39d36637b3895e..f357695ebb2a5b91fdc97e5c0f56e1055c84d782 100644 (file)
@@ -28,6 +28,7 @@
 #include "soc/timer_periph.h"
 #include "esp_heap_caps.h"
 
+#define MIN_BLOCK_SIZE  12
 /* Base offset in flash for tests. */
 static size_t start;
 
@@ -266,4 +267,36 @@ TEST_CASE("spi_flash_write can write from external RAM buffer", "[spi_flash]")
     free(buf_int);
 }
 
+TEST_CASE("spi_flash_read less than 16 bytes into buffer in external RAM", "[spi_flash]")
+{
+    uint8_t *buf_ext_8 = (uint8_t *) heap_caps_malloc(MIN_BLOCK_SIZE, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
+    TEST_ASSERT_NOT_NULL(buf_ext_8);
+
+    uint8_t *buf_int_8 = (uint8_t *) heap_caps_malloc(MIN_BLOCK_SIZE, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT);
+    TEST_ASSERT_NOT_NULL(buf_int_8);
+
+    uint8_t data_8[MIN_BLOCK_SIZE];
+    for (int i = 0; i < MIN_BLOCK_SIZE; i++) {
+        data_8[i] = i;
+    }
+
+    const esp_partition_t *part = get_test_data_partition();
+    TEST_ESP_OK(spi_flash_erase_range(part->address, SPI_FLASH_SEC_SIZE));
+    TEST_ESP_OK(spi_flash_write(part->address, data_8, MIN_BLOCK_SIZE));
+    TEST_ESP_OK(spi_flash_read(part->address, buf_ext_8, MIN_BLOCK_SIZE));
+    TEST_ESP_OK(spi_flash_read(part->address, buf_int_8, MIN_BLOCK_SIZE));
+
+    TEST_ASSERT_EQUAL(0, memcmp(buf_ext_8, data_8, MIN_BLOCK_SIZE));
+    TEST_ASSERT_EQUAL(0, memcmp(buf_int_8, data_8, MIN_BLOCK_SIZE));
+
+    if (buf_ext_8) {
+        free(buf_ext_8);
+        buf_ext_8 = NULL;
+    }
+    if (buf_int_8) {
+        free(buf_int_8);
+        buf_int_8 = NULL;
+    }
+}
+
 #endif // CONFIG_ESP32_SPIRAM_SUPPORT
index c2845ac964925a7312f71515bf2c8993c923d51a..35e80e0ebfbad6eb21b54aeda341d9a364924742 100644 (file)
@@ -233,7 +233,7 @@ UT_001:
 
 UT_002:
   extends: .unit_test_template
-  parallel: 18
+  parallel: 30
   tags:
     - ESP32_IDF
     - UT_T1_1
@@ -432,7 +432,7 @@ UT_029:
 # Gitlab parallel max value is 50. We need to create another UT job if parallel is larger than 50.
 UT_030:
   extends: .unit_test_template
-  parallel: 6
+  parallel: 10
   tags:
     - ESP32_IDF
     - UT_T1_1
diff --git a/tools/unit-test-app/configs/spi_flash_legacy b/tools/unit-test-app/configs/spi_flash_legacy
new file mode 100644 (file)
index 0000000..3d5b1d9
--- /dev/null
@@ -0,0 +1,3 @@
+TEST_COMPONENTS=spi_flash
+CONFIG_ESP32_SPIRAM_SUPPORT=y
+CONFIG_SPI_FLASH_USE_LEGACY_IMPL=y