picosoc: added memtest

This commit is contained in:
Steffen Vogel 2019-02-11 23:14:56 +01:00
parent d21937bafc
commit f3b1246c86
1 changed files with 126 additions and 28 deletions

View File

@ -20,7 +20,11 @@
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
#if !defined(ICEBREAKER) && !defined(HX8KDEMO) #ifdef ICEBREAKER
#define MEM_TOTAL 0x20000
#elif HX8KDEMO
#define MEM_TOTAL 0x200
#else
# error "Set -DICEBREAKER or -DHX8KDEMO when compiling firmware.c" # error "Set -DICEBREAKER or -DHX8KDEMO when compiling firmware.c"
#endif #endif
@ -176,11 +180,21 @@ void print_hex(uint32_t v, int digits)
void print_dec(uint32_t v) void print_dec(uint32_t v)
{ {
if (v >= 100) { if (v >= 1000) {
print(">=100"); print(">=1000");
return; return;
} }
if (v >= 900) { putchar('9'); v -= 900; }
else if (v >= 800) { putchar('8'); v -= 800; }
else if (v >= 700) { putchar('7'); v -= 700; }
else if (v >= 600) { putchar('6'); v -= 600; }
else if (v >= 500) { putchar('5'); v -= 500; }
else if (v >= 400) { putchar('4'); v -= 400; }
else if (v >= 300) { putchar('3'); v -= 300; }
else if (v >= 200) { putchar('2'); v -= 200; }
else if (v >= 100) { putchar('1'); v -= 100; }
if (v >= 90) { putchar('9'); v -= 90; } if (v >= 90) { putchar('9'); v -= 90; }
else if (v >= 80) { putchar('8'); v -= 80; } else if (v >= 80) { putchar('8'); v -= 80; }
else if (v >= 70) { putchar('7'); v -= 70; } else if (v >= 70) { putchar('7'); v -= 70; }
@ -236,6 +250,95 @@ char getchar()
return getchar_prompt(0); return getchar_prompt(0);
} }
void cmd_print_spi_state()
{
print("SPI State:\n");
print(" LATENCY ");
print_dec((reg_spictrl >> 16) & 15);
print("\n");
print(" DDR ");
if ((reg_spictrl & (1 << 22)) != 0)
print("ON\n");
else
print("OFF\n");
print(" QSPI ");
if ((reg_spictrl & (1 << 21)) != 0)
print("ON\n");
else
print("OFF\n");
print(" CRM ");
if ((reg_spictrl & (1 << 20)) != 0)
print("ON\n");
else
print("OFF\n");
}
uint32_t xorshift32(uint32_t *state)
{
/* Algorithm "xor" from p. 4 of Marsaglia, "Xorshift RNGs" */
uint32_t x = *state;
x ^= x << 13;
x ^= x >> 17;
x ^= x << 5;
*state = x;
return x;
}
void cmd_memtest()
{
int cyc_count = 5;
int stride = 256;
uint32_t state;
volatile uint32_t *base_word = (uint32_t *) 0;
volatile uint8_t *base_byte = (uint8_t *) 0;
print("Running memtest ");
// Walk in stride increments, word access
for (int i = 1; i <= cyc_count; i++) {
state = i;
for (int word = 0; word < MEM_TOTAL / sizeof(int); word += stride) {
*(base_word + word) = xorshift32(&state);
}
state = i;
for (int word = 0; word < MEM_TOTAL / sizeof(int); word += stride) {
if (*(base_word + word) != xorshift32(&state)) {
print(" ***FAILED WORD*** at ");
print_hex(4*word, 4);
print("\n");
return;
}
}
print(".");
}
// Byte access
for (int byte = 0; byte < 128; byte++) {
*(base_byte + byte) = (uint8_t) byte;
}
for (int byte = 0; byte < 128; byte++) {
if (*(base_byte + byte) != (uint8_t) byte) {
print(" ***FAILED BYTE*** at ");
print_hex(byte, 4);
print("\n");
return;
}
}
print(" passed\n");
}
// -------------------------------------------------------- // --------------------------------------------------------
void cmd_read_flash_id() void cmd_read_flash_id()
@ -570,36 +673,23 @@ void main()
print(" | |_) | |/ __/ _ \\___ \\ / _ \\| |\n"); print(" | |_) | |/ __/ _ \\___ \\ / _ \\| |\n");
print(" | __/| | (_| (_) |__) | (_) | |___\n"); print(" | __/| | (_| (_) |__) | (_) | |___\n");
print(" |_| |_|\\___\\___/____/ \\___/ \\____|\n"); print(" |_| |_|\\___\\___/____/ \\___/ \\____|\n");
print("\n");
print("Total memory: ");
print_dec(MEM_TOTAL / 1024);
print(" KiB\n");
print("\n");
cmd_memtest();
print("\n");
cmd_print_spi_state();
print("\n");
while (1) while (1)
{ {
print("\n"); print("\n");
print("\n");
print("SPI State:\n");
print(" LATENCY ");
print_dec((reg_spictrl >> 16) & 15);
print("\n");
print(" DDR ");
if ((reg_spictrl & (1 << 22)) != 0)
print("ON\n");
else
print("OFF\n");
print(" QSPI ");
if ((reg_spictrl & (1 << 21)) != 0)
print("ON\n");
else
print("OFF\n");
print(" CRM ");
if ((reg_spictrl & (1 << 20)) != 0)
print("ON\n");
else
print("OFF\n");
print("\n");
print("Select an action:\n"); print("Select an action:\n");
print("\n"); print("\n");
print(" [1] Read SPI Flash ID\n"); print(" [1] Read SPI Flash ID\n");
@ -611,6 +701,8 @@ void main()
print(" [7] Toggle continuous read mode\n"); print(" [7] Toggle continuous read mode\n");
print(" [9] Run simplistic benchmark\n"); print(" [9] Run simplistic benchmark\n");
print(" [0] Benchmark all configs\n"); print(" [0] Benchmark all configs\n");
print(" [M] Run Memtest\n");
print(" [S] Print SPI state\n");
print("\n"); print("\n");
for (int rep = 10; rep > 0; rep--) for (int rep = 10; rep > 0; rep--)
@ -650,6 +742,12 @@ void main()
case '0': case '0':
cmd_benchmark_all(); cmd_benchmark_all();
break; break;
case 'M':
cmd_memtest();
break;
case 'P':
cmd_print_spi_state();
break;
default: default:
continue; continue;
} }