diff --git a/BaS_gcc/tos/vmem_test/include/bas_printf.h b/BaS_gcc/tos/vmem_test/include/bas_printf.h index 5b42c28..ac44849 100644 --- a/BaS_gcc/tos/vmem_test/include/bas_printf.h +++ b/BaS_gcc/tos/vmem_test/include/bas_printf.h @@ -31,5 +31,5 @@ extern int sprintf(char *str, const char *format, ...); extern void display_progress(void); -extern void hexdump(uint8_t buffer[], int size); +extern void hexdump(volatile uint8_t buffer[], int size); #endif /* _BAS_PRINTF_H_ */ diff --git a/BaS_gcc/tos/vmem_test/sources/bas_printf.c b/BaS_gcc/tos/vmem_test/sources/bas_printf.c index d0d2f30..31691ce 100644 --- a/BaS_gcc/tos/vmem_test/sources/bas_printf.c +++ b/BaS_gcc/tos/vmem_test/sources/bas_printf.c @@ -417,27 +417,28 @@ void display_progress() xputchar('\r'); } -void hexdump(uint8_t buffer[], int size) +void hexdump(volatile uint8_t buffer[], int size) { int i; int line = 0; - uint8_t *bp = buffer; + volatile uint8_t *bp = buffer; while (bp < buffer + size) { - uint8_t *lbp = bp; + volatile uint8_t *lbp = bp; xprintf("%08x ", line); for (i = 0; i < 16; i++) { + uint8_t c = *lbp++; if (bp + i > buffer + size) { break; } - xprintf("%02x ", (uint8_t) *lbp++); + xprintf("%02x ", c); } lbp = bp; for (i = 0; i < 16; i++) { - int8_t c = *lbp++; + volatile int8_t c = *lbp++; if (bp + i > buffer + size) { break; diff --git a/BaS_gcc/tos/vmem_test/sources/vmem_test.c b/BaS_gcc/tos/vmem_test/sources/vmem_test.c index ef2c000..44ac3d3 100644 --- a/BaS_gcc/tos/vmem_test/sources/vmem_test.c +++ b/BaS_gcc/tos/vmem_test/sources/vmem_test.c @@ -122,6 +122,7 @@ static void init_video_ddr(void) { void do_tests(void) { uint32_t version; + uint32_t buffer[64]; xprintf("initialize Firebee video PLL\r\n"); init_pll(); @@ -138,20 +139,38 @@ void do_tests(void) xprintf("try to access Firebee FPGA memory\r\n"); - xprintf("read\r\n"); - start = MCF_SLT0_SCNT; - hexdump((uint8_t *) _VRAM, 64); - end = MCF_SLT0_SCNT; - time = (start - end) / (SYSCLK / 1000) / 1000; - - xprintf("finished (took %f seconds).\r\n", time / 1000.0); - xprintf("write\r\n"); start = MCF_SLT0_SCNT; for (i = 0; i < 64; i++) { - ((uint8_t *) _VRAM)[i] = (uint32_t) i; + ((volatile uint8_t *) _VRAM)[i] = (uint32_t) i; } + + xprintf("read\r\n"); + start = MCF_SLT0_SCNT; + + xprintf("byte read\r\n"); + for (i = 0; i < 64; i++) + ((uint8_t *) buffer)[i] = * ((uint8_t *) _VRAM) + i; + + hexdump((volatile uint8_t *) buffer, 64); + + xprintf("word read\r\n"); + for (i = 0; i < 64 / sizeof(uint16_t); i++) + ((uint16_t *) buffer)[i] = * ((uint16_t *) _VRAM) + i; + hexdump((volatile uint8_t *) buffer, 64); + + xprintf("longword read\r\n"); + for (i = 0; i < 64 / sizeof(uint32_t); i++) + ((uint32_t *) buffer)[i] = *((uint32_t *) _VRAM) + i; + hexdump((volatile uint8_t *) buffer, 64); + + end = MCF_SLT0_SCNT; + time = (start - end) / (SYSCLK / 1000) / 1000; + + xprintf("finished (took %f seconds).\r\n", time / 1000.0); + + end = MCF_SLT0_SCNT; time = (start - end) / (SYSCLK / 1000) / 1000; @@ -159,7 +178,7 @@ void do_tests(void) xprintf("read\r\n"); start = MCF_SLT0_SCNT; - hexdump((uint8_t *) _VRAM, 64); + hexdump((volatile uint8_t *) _VRAM, 64); end = MCF_SLT0_SCNT; time = (start - end) / (SYSCLK / 1000) / 1000; @@ -233,7 +252,7 @@ void wait_for_jtag(void) /* begin of tests */ - while (1) do_tests(); + do_tests(); xprintf("wait a little to let things settle...\r\n"); for (i = 0; i < 100000L; i++);