Skip to content

Commit

Permalink
tests/driver_nvram_spi: Simple test application for nvram_spi
Browse files Browse the repository at this point in the history
This is a simple test application for the nvram_spi driver for tests on
actual hardware.
  • Loading branch information
Joakim Gebart committed Mar 4, 2015
1 parent 0057675 commit aa72229
Show file tree
Hide file tree
Showing 3 changed files with 303 additions and 0 deletions.
34 changes: 34 additions & 0 deletions tests/driver_nvram_spi/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
APPLICATION = driver_nvram_spi
include ../Makefile.tests_common

FEATURES_REQUIRED = periph_spi periph_gpio

USEMODULE += nvram_spi
USEMODULE += vtimer

ifneq (,$(TEST_NVRAM_SPI_DEV))
CFLAGS += -DTEST_NVRAM_SPI_DEV=$(TEST_NVRAM_SPI_DEV)
else
# set arbitrary default
CFLAGS += -DTEST_NVRAM_SPI_DEV=SPI_0
endif
ifneq (,$(TEST_NVRAM_SPI_CS))
CFLAGS += -DTEST_NVRAM_SPI_CS=$(TEST_NVRAM_SPI_CS)
else
# set arbitrary default
CFLAGS += -DTEST_NVRAM_SPI_CS=GPIO_0
endif
ifneq (,$(TEST_NVRAM_SPI_SIZE))
CFLAGS += -DTEST_NVRAM_SPI_SIZE=$(TEST_NVRAM_SPI_SIZE)
else
# set tiny arbitrary default
CFLAGS += -DTEST_NVRAM_SPI_SIZE=64
endif
ifneq (,$(TEST_NVRAM_SPI_ADDRESS_COUNT))
CFLAGS += -DTEST_NVRAM_SPI_ADDRESS_COUNT=$(TEST_NVRAM_SPI_ADDRESS_COUNT)
else
# set 1 address byte by default, increase if using a larger module for test.
CFLAGS += -DTEST_NVRAM_SPI_ADDRESS_COUNT=1
endif

include $(RIOTBASE)/Makefile.include
12 changes: 12 additions & 0 deletions tests/driver_nvram_spi/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# About
This is a manual test application for the SPI NVRAM driver.

# Usage
This test application will initialize the SPI bus and NVRAM device with the
following parameters:

- Baudrate: 10 MHz (overridable by setting TEST_NVRAM_SPI_SPEED)
- SPI config: SPI_CONF_FIRST_RISING (overridable by setting TEST_NVRAM_SPI_CONF)

The memory will be overwritten by the test application. The original contents
will not be restored after the test.
257 changes: 257 additions & 0 deletions tests/driver_nvram_spi/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,257 @@
/*
* Copyright (C) 2015 Eistec AB
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/

/**
* @ingroup tests
* @{
*
* @file
* @brief Test application for the SPI NVRAM driver
*
* @author Joakim Gebart <joakim.gebart@eistec.se
*
* @}
*/

#include <stdio.h>
#include <string.h>
#include <ctype.h>

#include "board.h"
#include "vtimer.h"
#include "periph/spi.h"
#include "nvram-spi.h"

#ifndef TEST_NVRAM_SPI_DEV
#error "TEST_NVRAM_SPI_DEV not defined"
#endif
#ifndef TEST_NVRAM_SPI_CS
#error "TEST_NVRAM_SPI_CS not defined"
#endif
#ifndef TEST_NVRAM_SPI_SIZE
#error "TEST_NVRAM_SPI_SIZE not defined"
#endif
#ifndef TEST_NVRAM_SPI_ADDRESS_COUNT
#error "TEST_NVRAM_SPI_ADDRESS_COUNT not defined"
#endif

#ifdef TEST_NVRAM_SPI_CONF
#define SPI_CONF (TEST_NVRAM_SPI_CONF)
#else
#define SPI_CONF (SPI_CONF_FIRST_RISING)
#endif

#ifdef TEST_NVRAM_SPI_SPEED
#define SPI_SPEED (TEST_NVRAM_SPI_SPEED)
#else
#define SPI_SPEED (SPI_SPEED_10MHZ)
#endif

/* This will only work on small memories. Modify if you need to test NVRAM
* memories which do not fit inside free RAM */
static uint8_t buf_out[TEST_NVRAM_SPI_SIZE];
static uint8_t buf_in[TEST_NVRAM_SPI_SIZE];

/**
* @brief xxd-like printing of a binary buffer
*/
static void print_buffer(const uint8_t * buf, size_t length) {
static const unsigned int bytes_per_line = 16;
static const unsigned int bytes_per_group = 2;
unsigned long i = 0;
while (i < length) {
unsigned int col;
for (col = 0; col < bytes_per_line; ++col) {
/* Print hex data */
if (col == 0) {
printf("\n%08lx: ", i);
}
else if ((col % bytes_per_group) == 0) {
putchar(' ');
}
if ((i + col) < length) {
printf("%02hhx", buf[i + col]);
} else {
putchar(' ');
putchar(' ');
}
}
putchar(' ');
for (col = 0; col < bytes_per_line; ++col) {
if ((i + col) < length) {
/* Echo only printable chars */
if (isprint(buf[i + col])) {
putchar(buf[i + col]);
} else {
putchar('.');
}
} else {
putchar(' ');
}
}
i += bytes_per_line;
}
/* end with a newline */
puts("");
}

/* weak PRNG for generating "random" test data */
static uint8_t lcg_rand8(void) {
static const uint32_t a = 1103515245;
static const uint32_t c = 12345;
static uint32_t val = 123456; /* seed value */
val = val * a + c;
return (val >> 16) & 0xff;
}

int main(void)
{
uint32_t i;
nvram_spi_params_t spi_params = {
.spi = TEST_NVRAM_SPI_DEV,
.cs = TEST_NVRAM_SPI_CS,
.address_count = TEST_NVRAM_SPI_ADDRESS_COUNT,
};
nvram_t dev;
timex_t start_delay = {
.seconds = 10,
.microseconds = 0,
};

puts("NVRAM SPI test application starting...");
printf("Initializing SPI_%i... ", TEST_NVRAM_SPI_DEV);
if (spi_init_master(TEST_NVRAM_SPI_DEV, SPI_CONF, SPI_SPEED_10MHZ) == 0) {
puts("[OK]");
}
else {
puts("[Failed]\n");
return 1;
}

puts("Initializing NVRAM SPI device descriptor... ");
if (nvram_spi_init(&dev, &spi_params, TEST_NVRAM_SPI_SIZE) == 0) {
puts("[OK]");
}
else {
puts("[Failed]\n");
return 1;
}

puts("NVRAM SPI init done.\n");

puts("!!! This test will erase everything on the NVRAM !!!");
puts("!!! Unplug/reset/halt device now if this is not acceptable !!!");
puts("Waiting for 10 seconds before continuing...");
vtimer_sleep(start_delay);

puts("Reading current memory contents...");
for (i = 0; i < TEST_NVRAM_SPI_SIZE; ++i) {
if (dev.read(&dev, &buf_in[i], i, 1) != 1) {
puts("[Failed]\n");
return 1;
}
}
puts("[OK]");
puts("NVRAM contents before test:");
print_buffer(buf_in, sizeof(buf_in));

puts("Writing bytewise 0xFF to device");

memset(buf_out, 0xff, sizeof(buf_out));
for (i = 0; i < TEST_NVRAM_SPI_SIZE; ++i) {
if (dev.write(&dev, &buf_out[i], i, 1) != 1) {
puts("[Failed]\n");
return 1;
}
if (buf_out[i] != 0xff) {
puts("nvram_spi_write modified *src!");
printf(" i = %08lx\n", (unsigned long) i);
puts("[Failed]\n");
return 1;
}
}

puts("Reading back blockwise");
memset(buf_in, 0x00, sizeof(buf_in));
if (dev.read(&dev, buf_in, 0, TEST_NVRAM_SPI_SIZE) != TEST_NVRAM_SPI_SIZE) {
puts("[Failed]\n");
return 1;
}
puts("[OK]");
puts("Verifying contents...");
if (memcmp(buf_in, buf_out, TEST_NVRAM_SPI_SIZE) != 0) {
puts("[Failed]\n");
return 1;
}
puts("[OK]");

puts("Writing blockwise address complement to device");
for (i = 0; i < TEST_NVRAM_SPI_SIZE; ++i) {
buf_out[i] = (~(i)) & 0xff;
}
if (dev.write(&dev, buf_out, 0, TEST_NVRAM_SPI_SIZE) != TEST_NVRAM_SPI_SIZE) {
puts("[Failed]\n");
return 1;
}
puts("[OK]");
puts("buf_out:");
print_buffer(buf_out, sizeof(buf_out));
puts("Reading back blockwise");
memset(buf_in, 0x00, sizeof(buf_in));
if (dev.read(&dev, buf_in, 0, TEST_NVRAM_SPI_SIZE) != TEST_NVRAM_SPI_SIZE) {
puts("[Failed]\n");
return 1;
}
puts("[OK]");
puts("Verifying contents...");
if (memcmp(buf_in, buf_out, TEST_NVRAM_SPI_SIZE) != 0) {
puts("buf_in:");
print_buffer(buf_in, sizeof(buf_in));
puts("[Failed]\n");
return 1;
}
puts("[OK]");

puts("Generating pseudo-random test data...");

for (i = 0; i < TEST_NVRAM_SPI_SIZE; ++i) {
buf_out[i] = lcg_rand8();
}

puts("buf_out:");
print_buffer(buf_out, sizeof(buf_out));

puts("Writing blockwise data to device");
if (dev.write(&dev, buf_out, 0, TEST_NVRAM_SPI_SIZE) != TEST_NVRAM_SPI_SIZE) {
puts("[Failed]\n");
return 1;
}
puts("[OK]");

puts("Reading back blockwise");
memset(buf_in, 0x00, sizeof(buf_in));
if (dev.read(&dev, buf_in, 0, TEST_NVRAM_SPI_SIZE) != TEST_NVRAM_SPI_SIZE) {
puts("[Failed]\n");
return 1;
}
puts("[OK]");
puts("Verifying contents...");
if (memcmp(buf_in, buf_out, TEST_NVRAM_SPI_SIZE) != 0) {
puts("buf_in:");
print_buffer(buf_in, sizeof(buf_in));
puts("[Failed]\n");
return 1;
}
puts("[OK]");

puts("All tests passed!");

while(1);

return 0;
}

0 comments on commit aa72229

Please sign in to comment.