1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-04-25 20:02:37 +03:00
esp8266/tests/device/test_spi_flash/test_spi_flash.ino
Drzony 79ea883fb3
New flash writing method with offset/memory/size alignment handling (#7514)
* Do not write more data than requested on PUYA flashes

* Always align flash reads/writes to 4 bytes

* fixup! Always align flash reads/writes to 4 bytes

This commit simplifies the code a bit and fixes a bug that caused wrong number of bytes to be
written

* fixup! Always align flash reads/writes to 4 bytes

* fixup! Always align flash reads/writes to 4 bytes

* Check for result before additional read/write

* Add overloads for unaligned reads/writes

* fixup! Add overloads for unaligned reads/writes

* fixup! Add overloads for unaligned reads/writes

* fixup! Add overloads for unaligned reads/writes

* fixup! Add overloads for unaligned reads/writes

* fixup! Add overloads for unaligned reads/writes

* fixup! Add overloads for unaligned reads/writes

* fixup! Add overloads for unaligned reads/writes

* Add tests for flashRead/flashWrite

* fixup! Add overloads for unaligned reads/writes

* fixup! Add tests for flashRead/flashWrite

* fixup! Add tests for flashRead/flashWrite

* fixup! Add overloads for unaligned reads/writes
2020-10-14 22:21:41 -07:00

188 lines
4.5 KiB
C++

#include <BSTest.h>
#include <ESP8266WiFi.h>
BS_ENV_DECLARE();
void preinit() {
// (no C++ in function)
// disable wifi
ESP8266WiFiClass::preinitWiFiOff();
}
void setup()
{
Serial.begin(115200);
BS_RUN(Serial);
}
bool pretest()
{
return true;
}
bool compareBuffers(uint32_t *first, uint32_t *second, size_t offset, size_t len)
{
uint8_t *firstBytes = (uint8_t *)first;
uint8_t *secondBytes = (uint8_t *)second;
for (size_t i = offset; i < offset + len; i++)
{
if (firstBytes[i] != secondBytes[i])
{
Serial.printf("Compare fail @ %u\n", i);
for (size_t j = i & ~3; j < (i & ~3) + 4; j++)
{
Serial.printf("%02x ", firstBytes[j]);
}
Serial.println();
for (size_t j = i & ~3; j < (i & ~3) + 4; j++)
{
Serial.printf("%02x ", secondBytes[j]);
}
Serial.println();
return false;
}
}
return true;
}
bool testFlash(uint32_t start_offset, uint8_t data_offset, size_t amount)
{
static uint32_t *write_buffer = (uint32_t *)malloc(4096);
static uint32_t *read_buffer = (uint32_t *)malloc(4096);
for (uint32_t i = 0; i < 1024; i++)
{
write_buffer[i] = (i + 100) * 33;
read_buffer[i] = 0xAAAAAAAA;
}
Serial.println("---------------------------------------------------");
ESP.flashEraseSector(start_offset / 0x1000);
Serial.printf("Testing %d bytes @ %08x + %d\n", amount, start_offset, data_offset);
unsigned long start = micros();
if (!ESP.flashWrite(start_offset, (uint8_t *)write_buffer + data_offset, amount))
{
Serial.printf("Write fail\n");
return false;
}
if (!ESP.flashRead(start_offset, (uint8_t *)read_buffer + data_offset, amount))
{
Serial.printf("Read fail\n");
return false;
}
if (!compareBuffers(write_buffer, read_buffer, data_offset, amount))
{
return false;
}
Serial.printf("Write took %lu us\n", micros() - start);
return true;
}
// Columns in test case names are as following:
// 1. Offset -> +o (4 byte aligned), -o (unaligned)
// 2. Memory pointer -> +m (4 byte aligned), -m (unaligned)
// 3. Size -> +s (4 byte ), -s (unaligned)
// 4. Number of pages crossed -> np
// Aligned offset
// Aligned memory
// Aligned size
TEST_CASE("|+o|+m|+s|0p|", "[spi_flash]")
{
CHECK(testFlash(0xa0000, 0, 100));
}
TEST_CASE("|+o|+m|+s|1p|", "[spi_flash]")
{
CHECK(testFlash(0xa0000, 0, 512));
}
// Unaligned size
TEST_CASE("|+o|+m|-s|0p|", "[spi_flash]")
{
CHECK(testFlash(0xa0000, 0, 101));
}
TEST_CASE("|+o|+m|-s|2p|", "[spi_flash]")
{
CHECK(testFlash(0xa0000, 0, 515));
}
// Unaligned memory
// Aligned size
TEST_CASE("|+o|-m|+s|0|", "[spi_flash]")
{
CHECK(testFlash(0xa0000, 1, 100));
}
TEST_CASE("|+o|-m|+s|1p|", "[spi_flash]")
{
CHECK(testFlash(0xa0000, 3, 512));
}
// Unaligned size
TEST_CASE("|+o|-m|-s|0p|", "[spi_flash]")
{
CHECK(testFlash(0xa0000, 2, 101));
}
TEST_CASE("|+o|-m|-s|2p|", "[spi_flash]")
{
CHECK(testFlash(0xa0000, 1, 515));
}
// Unaligned offset
// Aligned memory
// Aligned size
TEST_CASE("|-o|+m|+s|0p|", "[spi_flash]")
{
CHECK(testFlash(0xa0001, 0, 100));
}
TEST_CASE("|-o|+m|+s|1p|", "[spi_flash]")
{
CHECK(testFlash(0xa0001, 0, 260));
}
// Unaligned size
TEST_CASE("|-o|+m|-s|0p|", "[spi_flash]")
{
CHECK(testFlash(0xa0001, 0, 105));
}
TEST_CASE("|-o|+m|-s|1p|", "[spi_flash]")
{
CHECK(testFlash(0xa0001, 0, 271));
}
// Unaligned memory
// Aligned size
TEST_CASE("|-o|-m|+s|0p|", "[spi_flash]")
{
CHECK(testFlash(0xa0001, 1, 100));
}
TEST_CASE("|-o|-m|+s|1p|", "[spi_flash]")
{
CHECK(testFlash(0xa0001, 2, 260));
}
// Unaligned size
TEST_CASE("|-o|-m|-s|0p|", "[spi_flash]")
{
CHECK(testFlash(0xa0001, 3, 105));
}
TEST_CASE("|-o|-m|-s|1p|", "[spi_flash]")
{
CHECK(testFlash(0xa0001, 1, 271));
}
TEST_CASE("Last bytes of page", "[spi_flash]")
{
CHECK(testFlash(0xa0000 + 255, 0, 1));
CHECK(testFlash(0xa0000 + 255, 1, 1));
CHECK(testFlash(0xa0000 + 254, 0, 2));
CHECK(testFlash(0xa0000 + 254, 1, 2));
CHECK(testFlash(0xa0000 + 253, 0, 3));
CHECK(testFlash(0xa0000 + 253, 1, 3));
}
TEST_CASE("Unaligned page cross only", "[spi_flash]")
{
CHECK(testFlash(0xa0000 + 254, 0, 3));
CHECK(testFlash(0xa0000 + 254, 1, 3));
CHECK(testFlash(0xa0000 + 255, 0, 2));
CHECK(testFlash(0xa0000 + 255, 1, 2));
}
void loop ()
{
}