diff options
author | barthess <barthess@yandex.ru> | 2015-02-24 17:43:53 +0300 |
---|---|---|
committer | barthess <barthess@yandex.ru> | 2015-02-24 17:43:53 +0300 |
commit | 900963482d2589fd752f0c7501c99b98ef4e8b82 (patch) | |
tree | 90789f6c07c6871491b26a95f1655e9ee17778a9 | |
parent | 33f1b2541ef3a15b4ed5875f741d71a19e773217 (diff) | |
download | ChibiOS-Contrib-900963482d2589fd752f0c7501c99b98ef4e8b82.tar.gz ChibiOS-Contrib-900963482d2589fd752f0c7501c99b98ef4e8b82.tar.bz2 ChibiOS-Contrib-900963482d2589fd752f0c7501c99b98ef4e8b82.zip |
Finished memtest code
-rw-r--r-- | os/hal/boards/NONSTANDARD_STM32F4_BARTHESS2/board.h | 4 | ||||
-rw-r--r-- | testhal/STM32/STM32F4xx/FSMC_SRAM/main.c | 26 | ||||
-rw-r--r-- | testhal/STM32/STM32F4xx/FSMC_SRAM/memtest.cpp | 64 | ||||
-rw-r--r-- | testhal/STM32/STM32F4xx/FSMC_SRAM/memtest.hpp | 8 |
4 files changed, 61 insertions, 41 deletions
diff --git a/os/hal/boards/NONSTANDARD_STM32F4_BARTHESS2/board.h b/os/hal/boards/NONSTANDARD_STM32F4_BARTHESS2/board.h index 83808df..9145af2 100644 --- a/os/hal/boards/NONSTANDARD_STM32F4_BARTHESS2/board.h +++ b/os/hal/boards/NONSTANDARD_STM32F4_BARTHESS2/board.h @@ -591,7 +591,7 @@ PIN_PUPDR_FLOATING(GPIOD_MEM_OE) | \ PIN_PUPDR_FLOATING(GPIOD_MEM_WE) | \ NAND_RB_NWAIT_PUPDR(GPIOD_NAND_RB_NWAIT) | \ - PIN_PUPDR_FLOATING(GPIOD_NAND_CE1) | \ + PIN_PUPDR_PULLUP(GPIOD_NAND_CE1) | \ PIN_PUPDR_FLOATING(GPIOD_MEM_D13) | \ PIN_PUPDR_FLOATING(GPIOD_MEM_D14) | \ PIN_PUPDR_FLOATING(GPIOD_MEM_D15) | \ @@ -899,7 +899,7 @@ NAND_RB1_PUPDR(GPIOG_NAND_RB1) | \ PIN_PUPDR_FLOATING(GPIOG_NAND_RB2) | \ PIN_PUPDR_FLOATING(GPIOG_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOG_NAND_CE2) | \ + PIN_PUPDR_PULLUP(GPIOG_NAND_CE2) | \ PIN_PUPDR_FLOATING(GPIOG_PIN10) | \ PIN_PUPDR_FLOATING(GPIOG_PIN11) | \ PIN_PUPDR_FLOATING(GPIOG_SRAM_CS1) | \ diff --git a/testhal/STM32/STM32F4xx/FSMC_SRAM/main.c b/testhal/STM32/STM32F4xx/FSMC_SRAM/main.c index c661d14..186450f 100644 --- a/testhal/STM32/STM32F4xx/FSMC_SRAM/main.c +++ b/testhal/STM32/STM32F4xx/FSMC_SRAM/main.c @@ -26,8 +26,8 @@ * DEFINES ****************************************************************************** */ -#define SRAM_START ((void *)FSMC_Bank1_4_MAP) #define SRAM_SIZE (512 * 1024) +#define SRAM_START ((void *)FSMC_Bank1_4_MAP) /* ****************************************************************************** @@ -49,11 +49,18 @@ static void mem_error_cb(memtest_t *memp, testtype_t e, size_t address); ****************************************************************************** */ +static size_t errors = 0; + +/* + * + */ +static uint8_t int_buf[64*1024]; + /* * SRAM driver configuration structure. */ static const SRAMConfig sram_cfg = { - 2 << 8 + (0 << 16) | (2 << 8) | (1 << 0) }; /* @@ -78,11 +85,6 @@ static membench_t membench_ext = { /* * */ -static uint8_t int_buf[64*1024]; - -/* - * - */ static membench_t membench_int = { int_buf, sizeof(int_buf), @@ -108,13 +110,15 @@ static inline void green_led_on(void) {palSetPad(GPIOI, GPIOI_LED_G);} static inline void green_led_off(void) {palClearPad(GPIOI, GPIOI_LED_G);} static inline void green_led_toggle(void) {palTogglePad(GPIOI, GPIOI_LED_G);} -static void mem_error_cb(memtest_t *memp, testtype_t e, size_t address) { +void mem_error_cb(memtest_t *memp, testtype_t e, size_t address) { (void)memp; (void)e; (void)address; green_led_off(); red_led_on(); + osalThreadSleepMilliseconds(10); + errors++; osalSysHalt("Memory broken"); } @@ -126,14 +130,8 @@ static void memtest(void) { red_led_off(); while (true) { - memtest_struct.width = MEMTEST_WIDTH_16; memtest_struct.rand_seed = chSysGetRealtimeCounterX(); memtest_run(&memtest_struct, MEMTEST_RUN_ALL); - - memtest_struct.width = MEMTEST_WIDTH_8; - memtest_struct.rand_seed = chSysGetRealtimeCounterX(); - memtest_run(&memtest_struct, MEMTEST_RUN_ALL); - green_led_toggle(); } diff --git a/testhal/STM32/STM32F4xx/FSMC_SRAM/memtest.cpp b/testhal/STM32/STM32F4xx/FSMC_SRAM/memtest.cpp index c12e952..1be98a2 100644 --- a/testhal/STM32/STM32F4xx/FSMC_SRAM/memtest.cpp +++ b/testhal/STM32/STM32F4xx/FSMC_SRAM/memtest.cpp @@ -82,18 +82,21 @@ template <typename T> class GeneratorMovingInvRand : public Generator<T> { public: GeneratorMovingInvRand(void) : step(0), prev(0){;} - void init(size_t seed) { + void init(T seed) { srand(seed); + step = 0; + prev = 0; } T get(void) { T ret; + T mask = -1; if ((step & 1) == 0) { - ret = rand(); + ret = rand() & mask; prev = ret; } else { - ret = ~prev; + ret = ~prev & mask; } step++; @@ -116,9 +119,8 @@ static void memtest_sequential(memtest_t *memp, Generator<T> &generator, T seed) /* fill ram */ generator.init(seed); - for (i=0; i<steps; i++) { + for (i=0; i<steps; i++) mem[i] = generator.get(); - } /* read back and compare */ generator.init(seed); @@ -149,15 +151,26 @@ static void own_address(memtest_t *memp) { } template <typename T> -static void moving_inversion(memtest_t *memp) { +static void moving_inversion_zero(memtest_t *memp) { GeneratorMovingInv<T> generator; + T mask = -1; memtest_sequential<T>(memp, generator, 0); + memtest_sequential<T>(memp, generator, 0xFFFFFFFF & mask); +} + +template <typename T> +static void moving_inversion_55aa(memtest_t *memp) { + GeneratorMovingInv<T> generator; + T mask = -1; + memtest_sequential<T>(memp, generator, 0x55555555 & mask); + memtest_sequential<T>(memp, generator, 0xAAAAAAAA & mask); } template <typename T> static void moving_inversion_rand(memtest_t *memp) { GeneratorMovingInvRand<T> generator; - memtest_sequential<T>(memp, generator, memp->rand_seed); + T mask = -1; + memtest_sequential<T>(memp, generator, memp->rand_seed & mask); } /* @@ -169,13 +182,13 @@ static void memtest_wrapper(memtest_t *memp, void (*p_u32)(memtest_t *memp)) { switch(memp->width){ case MEMTEST_WIDTH_32: - p_u32(memp); - p_u16(memp); p_u8(memp); + p_u16(memp); + p_u32(memp); break; case MEMTEST_WIDTH_16: - p_u16(memp); p_u8(memp); + p_u16(memp); break; case MEMTEST_WIDTH_8: p_u8(memp); @@ -190,37 +203,44 @@ void memtest_run(memtest_t *memp, uint32_t testmask) { if ((testmask & MEMTEST_WALKING_ONE) == MEMTEST_WALKING_ONE) { memtest_wrapper(memp, - walking_one<uint32_t>, + walking_one<uint8_t>, walking_one<uint16_t>, - walking_one<uint8_t>); + walking_one<uint32_t>); } if ((testmask & MEMTEST_WALKING_ZERO) == MEMTEST_WALKING_ZERO) { memtest_wrapper(memp, - walking_zero<uint32_t>, + walking_zero<uint8_t>, walking_zero<uint16_t>, - walking_zero<uint8_t>); + walking_zero<uint32_t>); } if ((testmask & MEMTEST_OWN_ADDRESS) == MEMTEST_OWN_ADDRESS) { memtest_wrapper(memp, - own_address<uint32_t>, + own_address<uint8_t>, own_address<uint16_t>, - own_address<uint8_t>); + own_address<uint32_t>); + } + + if ((testmask & MEMTEST_MOVING_INVERSION_ZERO) == MEMTEST_MOVING_INVERSION_ZERO) { + memtest_wrapper(memp, + moving_inversion_zero<uint8_t>, + moving_inversion_zero<uint16_t>, + moving_inversion_zero<uint32_t>); } - if ((testmask & MEMTEST_MOVING_INVERSION) == MEMTEST_MOVING_INVERSION) { + if ((testmask & MEMTEST_MOVING_INVERSION_55AA) == MEMTEST_MOVING_INVERSION_55AA) { memtest_wrapper(memp, - moving_inversion<uint32_t>, - moving_inversion<uint16_t>, - moving_inversion<uint8_t>); + moving_inversion_55aa<uint8_t>, + moving_inversion_55aa<uint16_t>, + moving_inversion_55aa<uint32_t>); } if ((testmask & MEMTEST_MOVING_INVERSION_RAND) == MEMTEST_MOVING_INVERSION_RAND) { memtest_wrapper(memp, - moving_inversion_rand<uint32_t>, + moving_inversion_rand<uint8_t>, moving_inversion_rand<uint16_t>, - moving_inversion_rand<uint8_t>); + moving_inversion_rand<uint32_t>); } } diff --git a/testhal/STM32/STM32F4xx/FSMC_SRAM/memtest.hpp b/testhal/STM32/STM32F4xx/FSMC_SRAM/memtest.hpp index 8b21e94..4a9e4e3 100644 --- a/testhal/STM32/STM32F4xx/FSMC_SRAM/memtest.hpp +++ b/testhal/STM32/STM32F4xx/FSMC_SRAM/memtest.hpp @@ -4,13 +4,15 @@ #define MEMTEST_WALKING_ONE (1 << 0) #define MEMTEST_WALKING_ZERO (1 << 1) #define MEMTEST_OWN_ADDRESS (1 << 2) -#define MEMTEST_MOVING_INVERSION (1 << 3) -#define MEMTEST_MOVING_INVERSION_RAND (1 << 4) +#define MEMTEST_MOVING_INVERSION_ZERO (1 << 3) +#define MEMTEST_MOVING_INVERSION_55AA (1 << 4) +#define MEMTEST_MOVING_INVERSION_RAND (1 << 5) #define MEMTEST_RUN_ALL (MEMTEST_WALKING_ONE | \ MEMTEST_WALKING_ZERO | \ MEMTEST_OWN_ADDRESS | \ - MEMTEST_MOVING_INVERSION | \ + MEMTEST_MOVING_INVERSION_ZERO | \ + MEMTEST_MOVING_INVERSION_55AA | \ MEMTEST_MOVING_INVERSION_RAND) typedef struct memtest_t memtest_t; |