|
|
|
@ -1,6 +1,12 @@
|
|
|
|
|
/*
|
|
|
|
|
* SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
|
|
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
|
|
|
|
*/
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include <inttypes.h>
|
|
|
|
|
#include <freertos/FreeRTOS.h>
|
|
|
|
|
#include <freertos/task.h>
|
|
|
|
|
#include <freertos/semphr.h>
|
|
|
|
@ -14,8 +20,6 @@
|
|
|
|
|
#include "test_utils.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32C2)
|
|
|
|
|
//IDF-5138
|
|
|
|
|
static uint32_t buffer[1024];
|
|
|
|
|
|
|
|
|
|
/* read-only region used for mmap tests, intialised in setup_mmap_tests() */
|
|
|
|
@ -23,7 +27,6 @@ static uint32_t start;
|
|
|
|
|
static uint32_t end;
|
|
|
|
|
|
|
|
|
|
static spi_flash_mmap_handle_t handle1, handle2, handle3;
|
|
|
|
|
#endif //!TEMPORARY_DISABLED_FOR_TARGETS(ESP32C2)
|
|
|
|
|
|
|
|
|
|
static esp_err_t spi_flash_read_maybe_encrypted(size_t src_addr, void *des_addr, size_t size)
|
|
|
|
|
{
|
|
|
|
@ -34,8 +37,6 @@ static esp_err_t spi_flash_read_maybe_encrypted(size_t src_addr, void *des_addr,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32C2)
|
|
|
|
|
//IDF-5138
|
|
|
|
|
static esp_err_t spi_flash_write_maybe_encrypted(size_t des_addr, const void *src_addr, size_t size)
|
|
|
|
|
{
|
|
|
|
|
if (!esp_flash_encryption_enabled()) {
|
|
|
|
@ -51,10 +52,10 @@ static void setup_mmap_tests(void)
|
|
|
|
|
const esp_partition_t *part = get_test_data_partition();
|
|
|
|
|
start = part->address;
|
|
|
|
|
end = part->address + part->size;
|
|
|
|
|
printf("Test data partition @ 0x%x - 0x%x\n", start, end);
|
|
|
|
|
printf("Test data partition @ 0x%"PRIx32" - 0x%"PRIx32"\n", start, end);
|
|
|
|
|
}
|
|
|
|
|
TEST_ASSERT(end > start);
|
|
|
|
|
TEST_ASSERT(end - start >= 512*1024);
|
|
|
|
|
TEST_ASSERT(end - start >= 512 * 1024);
|
|
|
|
|
|
|
|
|
|
/* clean up any mmap handles left over from failed tests */
|
|
|
|
|
if (handle1) {
|
|
|
|
@ -83,7 +84,7 @@ static void setup_mmap_tests(void)
|
|
|
|
|
for (uint32_t word = 0; word < 1024; ++word) {
|
|
|
|
|
uint32_t val = rand();
|
|
|
|
|
if (block == start / 0x10000 && sector == 0 && word == 0) {
|
|
|
|
|
printf("setup_mmap_tests(): first prepped word: 0x%08x (flash holds 0x%08x)\n", val, buffer[word]);
|
|
|
|
|
printf("setup_mmap_tests(): first prepped word: 0x%08"PRIx32" (flash holds 0x%08"PRIx32")\n", val, buffer[word]);
|
|
|
|
|
}
|
|
|
|
|
if (buffer[word] != val) {
|
|
|
|
|
buffer[word] = val;
|
|
|
|
@ -101,12 +102,13 @@ static void setup_mmap_tests(void)
|
|
|
|
|
|
|
|
|
|
TEST_CASE("Can mmap into data address space", "[spi_flash][mmap]")
|
|
|
|
|
{
|
|
|
|
|
esp_err_t ret = ESP_FAIL;
|
|
|
|
|
setup_mmap_tests();
|
|
|
|
|
|
|
|
|
|
printf("Mapping %x (+%x)\n", start, end - start);
|
|
|
|
|
printf("Mapping %"PRIx32" (+%"PRIx32")\n", start, end - start);
|
|
|
|
|
const void *ptr1;
|
|
|
|
|
TEST_ESP_OK( spi_flash_mmap(start, end - start, SPI_FLASH_MMAP_DATA, &ptr1, &handle1) );
|
|
|
|
|
printf("mmap_res: handle=%d ptr=%p\n", handle1, ptr1);
|
|
|
|
|
printf("mmap_res: handle=%"PRIx32" ptr=%p\n", (uint32_t)handle1, ptr1);
|
|
|
|
|
|
|
|
|
|
spi_flash_mmap_dump();
|
|
|
|
|
|
|
|
|
@ -121,20 +123,22 @@ TEST_CASE("Can mmap into data address space", "[spi_flash][mmap]")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
printf("Mapping %x (+%x)\n", start - 0x10000, 0x20000);
|
|
|
|
|
printf("Mapping %"PRIx32" (+%x)\n", start - 0x10000, 0x20000);
|
|
|
|
|
const void *ptr2;
|
|
|
|
|
TEST_ESP_OK( spi_flash_mmap(start - 0x10000, 0x20000, SPI_FLASH_MMAP_DATA, &ptr2, &handle2) );
|
|
|
|
|
printf("mmap_res: handle=%d ptr=%p\n", handle2, ptr2);
|
|
|
|
|
printf("mmap_res: handle=%"PRIx32" ptr=%p\n", (uint32_t)handle2, ptr2);
|
|
|
|
|
|
|
|
|
|
TEST_ASSERT_EQUAL_HEX32(start - 0x10000, spi_flash_cache2phys(ptr2));
|
|
|
|
|
TEST_ASSERT_EQUAL_PTR(ptr2, spi_flash_phys2cache(start - 0x10000, SPI_FLASH_MMAP_DATA));
|
|
|
|
|
|
|
|
|
|
spi_flash_mmap_dump();
|
|
|
|
|
|
|
|
|
|
printf("Mapping %x (+%x)\n", start, 0x10000);
|
|
|
|
|
printf("Mapping %"PRIx32" (+%x)\n", start, 0x10000);
|
|
|
|
|
const void *ptr3;
|
|
|
|
|
TEST_ESP_OK( spi_flash_mmap(start, 0x10000, SPI_FLASH_MMAP_DATA, &ptr3, &handle3) );
|
|
|
|
|
printf("mmap_res: handle=%d ptr=%p\n", handle3, ptr3);
|
|
|
|
|
ret = spi_flash_mmap(start, 0x10000, SPI_FLASH_MMAP_DATA, &ptr3, &handle3);
|
|
|
|
|
printf("ret: 0x%x\n", ret);
|
|
|
|
|
TEST_ASSERT(ret == ESP_OK);
|
|
|
|
|
printf("mmap_res: handle=%"PRIx32" ptr=%p\n", (uint32_t)handle3, ptr3);
|
|
|
|
|
|
|
|
|
|
TEST_ASSERT_EQUAL_HEX32(start, spi_flash_cache2phys(ptr3));
|
|
|
|
|
TEST_ASSERT_EQUAL_PTR(ptr3, spi_flash_phys2cache(start, SPI_FLASH_MMAP_DATA));
|
|
|
|
@ -156,24 +160,24 @@ TEST_CASE("Can mmap into data address space", "[spi_flash][mmap]")
|
|
|
|
|
spi_flash_munmap(handle3);
|
|
|
|
|
handle3 = 0;
|
|
|
|
|
|
|
|
|
|
printf("start corresponding vaddr: 0x%x\n", (int)spi_flash_phys2cache(start, SPI_FLASH_MMAP_DATA));
|
|
|
|
|
TEST_ASSERT_EQUAL_PTR(NULL, spi_flash_phys2cache(start, SPI_FLASH_MMAP_DATA));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if !DISABLED_FOR_TARGETS(ESP32S3, ESP32C3)
|
|
|
|
|
/* On S3/C3 the cache is programmatically split between Icache and dcache and with the default setup we dont leave a lot pages
|
|
|
|
|
#if !(CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C2)
|
|
|
|
|
/* On S3/C3/C2 the cache is programmatically split between Icache and dcache and with the default setup we dont leave a lot pages
|
|
|
|
|
available for additional mmaps into instruction space. Disabling this test for now since any hypothetical use case for this
|
|
|
|
|
is no longer supported "out of the box"
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
TEST_CASE("Can mmap into instruction address space", "[spi_flash][mmap]")
|
|
|
|
|
{
|
|
|
|
|
setup_mmap_tests();
|
|
|
|
|
|
|
|
|
|
printf("Mapping %x (+%x)\n", start, end - start);
|
|
|
|
|
printf("Mapping %"PRIx32" (+%"PRIx32")\n", start, end - start);
|
|
|
|
|
spi_flash_mmap_handle_t handle1;
|
|
|
|
|
const void *ptr1;
|
|
|
|
|
TEST_ESP_OK( spi_flash_mmap(start, end - start, SPI_FLASH_MMAP_INST, &ptr1, &handle1) );
|
|
|
|
|
printf("mmap_res: handle=%d ptr=%p\n", handle1, ptr1);
|
|
|
|
|
printf("mmap_res: handle=%"PRIx32" ptr=%p\n", (uint32_t)handle1, ptr1);
|
|
|
|
|
|
|
|
|
|
spi_flash_mmap_dump();
|
|
|
|
|
|
|
|
|
@ -186,22 +190,22 @@ TEST_CASE("Can mmap into instruction address space", "[spi_flash][mmap]")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
printf("Mapping %x (+%x)\n", start - 0x10000, 0x20000);
|
|
|
|
|
printf("Mapping %"PRIx32" (+%x)\n", start - 0x10000, 0x20000);
|
|
|
|
|
spi_flash_mmap_handle_t handle2;
|
|
|
|
|
const void *ptr2;
|
|
|
|
|
TEST_ESP_OK( spi_flash_mmap(start - 0x10000, 0x20000, SPI_FLASH_MMAP_INST, &ptr2, &handle2) );
|
|
|
|
|
printf("mmap_res: handle=%d ptr=%p\n", handle2, ptr2);
|
|
|
|
|
printf("mmap_res: handle=%"PRIx32" ptr=%p\n", (uint32_t)handle2, ptr2);
|
|
|
|
|
|
|
|
|
|
TEST_ASSERT_EQUAL_HEX32(start - 0x10000, spi_flash_cache2phys(ptr2));
|
|
|
|
|
TEST_ASSERT_EQUAL_PTR(ptr2, spi_flash_phys2cache(start - 0x10000, SPI_FLASH_MMAP_INST));
|
|
|
|
|
|
|
|
|
|
spi_flash_mmap_dump();
|
|
|
|
|
|
|
|
|
|
printf("Mapping %x (+%x)\n", start, 0x10000);
|
|
|
|
|
printf("Mapping %"PRIx32" (+%x)\n", start, 0x10000);
|
|
|
|
|
spi_flash_mmap_handle_t handle3;
|
|
|
|
|
const void *ptr3;
|
|
|
|
|
TEST_ESP_OK( spi_flash_mmap(start, 0x10000, SPI_FLASH_MMAP_INST, &ptr3, &handle3) );
|
|
|
|
|
printf("mmap_res: handle=%d ptr=%p\n", handle3, ptr3);
|
|
|
|
|
printf("mmap_res: handle=%"PRIx32" ptr=%p\n", (uint32_t)handle3, ptr3);
|
|
|
|
|
|
|
|
|
|
TEST_ASSERT_EQUAL_HEX32(start, spi_flash_cache2phys(ptr3));
|
|
|
|
|
TEST_ASSERT_EQUAL_PTR(ptr3, spi_flash_phys2cache(start, SPI_FLASH_MMAP_INST));
|
|
|
|
@ -218,11 +222,8 @@ TEST_CASE("Can mmap into instruction address space", "[spi_flash][mmap]")
|
|
|
|
|
|
|
|
|
|
printf("Unmapping handle3\n");
|
|
|
|
|
spi_flash_munmap(handle3);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif //!DISABLED_FOR_TARGETS(ESP32S3, ESP32C3)
|
|
|
|
|
|
|
|
|
|
#endif // #if !CONFIG_IDF_TARGET_ESP32C2
|
|
|
|
|
|
|
|
|
|
TEST_CASE("Can mmap unordered pages into contiguous memory", "[spi_flash][mmap]")
|
|
|
|
|
{
|
|
|
|
@ -231,15 +232,15 @@ TEST_CASE("Can mmap unordered pages into contiguous memory", "[spi_flash][mmap]"
|
|
|
|
|
int startpage;
|
|
|
|
|
|
|
|
|
|
setup_mmap_tests();
|
|
|
|
|
nopages=(end-start)/SPI_FLASH_MMU_PAGE_SIZE;
|
|
|
|
|
pages=alloca(sizeof(int)*nopages);
|
|
|
|
|
nopages = (end - start) / SPI_FLASH_MMU_PAGE_SIZE;
|
|
|
|
|
pages = alloca(sizeof(int) * nopages);
|
|
|
|
|
|
|
|
|
|
startpage=start/SPI_FLASH_MMU_PAGE_SIZE;
|
|
|
|
|
startpage = start / SPI_FLASH_MMU_PAGE_SIZE;
|
|
|
|
|
|
|
|
|
|
//make inverse mapping: virt 0 -> page (nopages-1), virt 1 -> page (nopages-2), ...
|
|
|
|
|
for (int i=0; i<nopages; i++) {
|
|
|
|
|
pages[i]=startpage+(nopages-1)-i;
|
|
|
|
|
printf("Offset %x page %d\n", i*0x10000, pages[i]);
|
|
|
|
|
for (int i = 0; i < nopages; i++) {
|
|
|
|
|
pages[i] = startpage + (nopages - 1) - i;
|
|
|
|
|
printf("Offset %x page %d\n", i * SPI_FLASH_MMU_PAGE_SIZE, pages[i]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
printf("Attempting mapping of unordered pages to contiguous memory area\n");
|
|
|
|
@ -247,23 +248,31 @@ TEST_CASE("Can mmap unordered pages into contiguous memory", "[spi_flash][mmap]"
|
|
|
|
|
spi_flash_mmap_handle_t handle1;
|
|
|
|
|
const void *ptr1;
|
|
|
|
|
TEST_ESP_OK( spi_flash_mmap_pages(pages, nopages, SPI_FLASH_MMAP_DATA, &ptr1, &handle1) );
|
|
|
|
|
printf("mmap_res: handle=%d ptr=%p\n", handle1, ptr1);
|
|
|
|
|
printf("mmap_res: handle=%"PRIx32" ptr=%p\n", (uint32_t)handle1, ptr1);
|
|
|
|
|
|
|
|
|
|
spi_flash_mmap_dump();
|
|
|
|
|
#if (CONFIG_MMU_PAGE_SIZE == 0x10000)
|
|
|
|
|
uint32_t words_per_sector = 1024;
|
|
|
|
|
#elif (CONFIG_MMU_PAGE_SIZE == 0x8000)
|
|
|
|
|
uint32_t words_per_sector = 512;
|
|
|
|
|
#elif (CONFIG_MMU_PAGE_SIZE == 0x4000)
|
|
|
|
|
uint32_t words_per_sector = 256;
|
|
|
|
|
#else
|
|
|
|
|
uint32_t words_per_sector = 128;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
srand(0);
|
|
|
|
|
const uint32_t *data = (const uint32_t *) ptr1;
|
|
|
|
|
for (int block = 0; block < nopages; ++block) {
|
|
|
|
|
for (int block = 0; block < 1; ++block) {
|
|
|
|
|
for (int sector = 0; sector < 16; ++sector) {
|
|
|
|
|
for (uint32_t word = 0; word < 1024; ++word) {
|
|
|
|
|
TEST_ASSERT_EQUAL_UINT32(rand(), data[(((nopages-1)-block) * 16 + sector) * 1024 + word]);
|
|
|
|
|
for (uint32_t word = 0; word < words_per_sector; ++word) {
|
|
|
|
|
TEST_ASSERT_EQUAL_UINT32(rand(), data[(((nopages - 1) - block) * 16 + sector) * words_per_sector + word]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
printf("Unmapping handle1\n");
|
|
|
|
|
spi_flash_munmap(handle1);
|
|
|
|
|
spi_flash_mmap_dump();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_CASE("flash_mmap invalidates just-written data", "[spi_flash][mmap]")
|
|
|
|
@ -282,7 +291,7 @@ TEST_CASE("flash_mmap invalidates just-written data", "[spi_flash][mmap]")
|
|
|
|
|
|
|
|
|
|
/* map erased test region to ptr1 */
|
|
|
|
|
TEST_ESP_OK( spi_flash_mmap(start, test_size, SPI_FLASH_MMAP_DATA, &ptr1, &handle1) );
|
|
|
|
|
printf("mmap_res ptr1: handle=%d ptr=%p\n", handle1, ptr1);
|
|
|
|
|
printf("mmap_res ptr1: handle=%"PRIx32" ptr=%p\n", (uint32_t)handle1, ptr1);
|
|
|
|
|
|
|
|
|
|
/* verify it's all 0xFF */
|
|
|
|
|
for (int i = 0; i < test_size; i++) {
|
|
|
|
@ -304,7 +313,7 @@ TEST_CASE("flash_mmap invalidates just-written data", "[spi_flash][mmap]")
|
|
|
|
|
ensuring we see the updated flash.
|
|
|
|
|
*/
|
|
|
|
|
TEST_ESP_OK( spi_flash_mmap(start, test_size, SPI_FLASH_MMAP_DATA, &ptr1, &handle1) );
|
|
|
|
|
printf("mmap_res ptr1 #2: handle=%d ptr=%p\n", handle1, ptr1);
|
|
|
|
|
printf("mmap_res ptr1 #2: handle=%"PRIx32" ptr=%p\n", (uint32_t)handle1, ptr1);
|
|
|
|
|
|
|
|
|
|
/* assert that ptr1 now maps to the new values on flash,
|
|
|
|
|
ie contents of buf array.
|
|
|
|
@ -320,10 +329,10 @@ TEST_CASE("flash_mmap can mmap after get enough free MMU pages", "[spi_flash][mm
|
|
|
|
|
//this test case should make flash size >= 4MB, because max size of Dcache can mapped is 4MB
|
|
|
|
|
setup_mmap_tests();
|
|
|
|
|
|
|
|
|
|
printf("Mapping %x (+%x)\n", start, end - start);
|
|
|
|
|
printf("Mapping %"PRIx32" (+%"PRIx32")\n", start, end - start);
|
|
|
|
|
const void *ptr1;
|
|
|
|
|
TEST_ESP_OK( spi_flash_mmap(start, end - start, SPI_FLASH_MMAP_DATA, &ptr1, &handle1) );
|
|
|
|
|
printf("mmap_res: handle=%d ptr=%p\n", handle1, ptr1);
|
|
|
|
|
printf("mmap_res: handle=%"PRIx32" ptr=%p\n", (uint32_t)handle1, ptr1);
|
|
|
|
|
|
|
|
|
|
spi_flash_mmap_dump();
|
|
|
|
|
|
|
|
|
@ -344,10 +353,10 @@ TEST_CASE("flash_mmap can mmap after get enough free MMU pages", "[spi_flash][mm
|
|
|
|
|
uint32_t flash_pages = flash_size / SPI_FLASH_MMU_PAGE_SIZE;
|
|
|
|
|
free_pages = (free_pages > flash_pages) ? flash_pages : free_pages;
|
|
|
|
|
|
|
|
|
|
printf("Mapping %x (+%x)\n", 0, free_pages * SPI_FLASH_MMU_PAGE_SIZE);
|
|
|
|
|
printf("Mapping %x (+%"PRIx32")\n", 0, free_pages * SPI_FLASH_MMU_PAGE_SIZE);
|
|
|
|
|
const void *ptr2;
|
|
|
|
|
TEST_ESP_OK( spi_flash_mmap(0, free_pages * SPI_FLASH_MMU_PAGE_SIZE, SPI_FLASH_MMAP_DATA, &ptr2, &handle2) );
|
|
|
|
|
printf("mmap_res: handle=%d ptr=%p\n", handle2, ptr2);
|
|
|
|
|
printf("mmap_res: handle=%"PRIx32" ptr=%p\n", (uint32_t)handle2, ptr2);
|
|
|
|
|
|
|
|
|
|
spi_flash_mmap_dump();
|
|
|
|
|
|
|
|
|
@ -364,7 +373,6 @@ TEST_CASE("flash_mmap can mmap after get enough free MMU pages", "[spi_flash][mm
|
|
|
|
|
|
|
|
|
|
TEST_ASSERT_EQUAL_PTR(NULL, spi_flash_phys2cache(start, SPI_FLASH_MMAP_DATA));
|
|
|
|
|
}
|
|
|
|
|
#endif //!TEMPORARY_DISABLED_FOR_TARGETS(ESP32C2)
|
|
|
|
|
|
|
|
|
|
TEST_CASE("phys2cache/cache2phys basic checks", "[spi_flash][mmap]")
|
|
|
|
|
{
|
|
|
|
@ -377,11 +385,13 @@ TEST_CASE("phys2cache/cache2phys basic checks", "[spi_flash][mmap]")
|
|
|
|
|
uint32_t phys = spi_flash_cache2phys(esp_partition_find);
|
|
|
|
|
TEST_ASSERT_NOT_EQUAL(SPI_FLASH_CACHE2PHYS_FAIL, phys);
|
|
|
|
|
TEST_ASSERT_EQUAL_PTR(esp_partition_find, spi_flash_phys2cache(phys, SPI_FLASH_MMAP_INST));
|
|
|
|
|
#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2
|
|
|
|
|
TEST_ASSERT_EQUAL_PTR(NULL, spi_flash_phys2cache(phys, SPI_FLASH_MMAP_DATA));
|
|
|
|
|
#endif //#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2
|
|
|
|
|
|
|
|
|
|
/* Read the flash @ 'phys' and compare it to the data we get via regular cache access */
|
|
|
|
|
spi_flash_read_maybe_encrypted(phys, buf, sizeof(buf));
|
|
|
|
|
TEST_ASSERT_EQUAL_HEX32_ARRAY((void *)esp_partition_find, buf, sizeof(buf)/sizeof(uint32_t));
|
|
|
|
|
TEST_ASSERT_EQUAL_HEX32_ARRAY((void *)esp_partition_find, buf, sizeof(buf) / sizeof(uint32_t));
|
|
|
|
|
|
|
|
|
|
/* spi_flash_mmap is in IRAM */
|
|
|
|
|
printf("%p\n", spi_flash_mmap);
|
|
|
|
@ -393,15 +403,15 @@ TEST_CASE("phys2cache/cache2phys basic checks", "[spi_flash][mmap]")
|
|
|
|
|
TEST_ASSERT_NOT_EQUAL(SPI_FLASH_CACHE2PHYS_FAIL, phys);
|
|
|
|
|
TEST_ASSERT_EQUAL_PTR(&constant_data,
|
|
|
|
|
spi_flash_phys2cache(phys, SPI_FLASH_MMAP_DATA));
|
|
|
|
|
#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2
|
|
|
|
|
TEST_ASSERT_EQUAL_PTR(NULL, spi_flash_phys2cache(phys, SPI_FLASH_MMAP_INST));
|
|
|
|
|
#endif //#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2
|
|
|
|
|
|
|
|
|
|
/* Read the flash @ 'phys' and compare it to the data we get via normal cache access */
|
|
|
|
|
spi_flash_read_maybe_encrypted(phys, buf, sizeof(constant_data));
|
|
|
|
|
TEST_ASSERT_EQUAL_HEX8_ARRAY(constant_data, buf, sizeof(constant_data));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32C2)
|
|
|
|
|
//IDF-5138
|
|
|
|
|
TEST_CASE("mmap consistent with phys2cache/cache2phys", "[spi_flash][mmap]")
|
|
|
|
|
{
|
|
|
|
|
const void *ptr = NULL;
|
|
|
|
@ -433,16 +443,16 @@ TEST_CASE("munmap followed by mmap flushes cache", "[spi_flash][mmap]")
|
|
|
|
|
|
|
|
|
|
const esp_partition_t *p = get_test_data_partition();
|
|
|
|
|
|
|
|
|
|
const uint32_t* data;
|
|
|
|
|
const uint32_t *data;
|
|
|
|
|
spi_flash_mmap_handle_t handle;
|
|
|
|
|
TEST_ESP_OK( esp_partition_mmap(p, 0, SPI_FLASH_MMU_PAGE_SIZE,
|
|
|
|
|
SPI_FLASH_MMAP_DATA, (const void **) &data, &handle) );
|
|
|
|
|
SPI_FLASH_MMAP_DATA, (const void **) &data, &handle) );
|
|
|
|
|
uint32_t buf[16];
|
|
|
|
|
memcpy(buf, data, sizeof(buf));
|
|
|
|
|
|
|
|
|
|
spi_flash_munmap(handle);
|
|
|
|
|
TEST_ESP_OK( esp_partition_mmap(p, SPI_FLASH_MMU_PAGE_SIZE, SPI_FLASH_MMU_PAGE_SIZE,
|
|
|
|
|
SPI_FLASH_MMAP_DATA, (const void **) &data, &handle) );
|
|
|
|
|
SPI_FLASH_MMAP_DATA, (const void **) &data, &handle) );
|
|
|
|
|
TEST_ASSERT_NOT_EQUAL(0, memcmp(buf, data, sizeof(buf)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -455,10 +465,10 @@ TEST_CASE("no stale data read post mmap and write partition", "[spi_flash][mmap]
|
|
|
|
|
|
|
|
|
|
const esp_partition_t *p = get_test_data_partition();
|
|
|
|
|
|
|
|
|
|
const uint32_t* data;
|
|
|
|
|
const uint32_t *data;
|
|
|
|
|
spi_flash_mmap_handle_t handle;
|
|
|
|
|
TEST_ESP_OK(esp_partition_mmap(p, 0, SPI_FLASH_MMU_PAGE_SIZE,
|
|
|
|
|
SPI_FLASH_MMAP_DATA, (const void **) &data, &handle) );
|
|
|
|
|
SPI_FLASH_MMAP_DATA, (const void **) &data, &handle) );
|
|
|
|
|
memcpy(read_data, data, sizeof(read_data));
|
|
|
|
|
TEST_ESP_OK(esp_partition_erase_range(p, 0, SPI_FLASH_MMU_PAGE_SIZE));
|
|
|
|
|
/* not using esp_partition_write here, since the partition in not marked as "encrypted"
|
|
|
|
@ -470,4 +480,3 @@ TEST_CASE("no stale data read post mmap and write partition", "[spi_flash][mmap]
|
|
|
|
|
spi_flash_munmap(handle);
|
|
|
|
|
TEST_ASSERT_EQUAL(0, memcmp(buf, read_data, sizeof(buf)));
|
|
|
|
|
}
|
|
|
|
|
#endif //!TEMPORARY_DISABLED_FOR_TARGETS(ESP32C2)
|