From: Dan White Date: Sat, 13 Apr 2013 17:42:33 +0000 (-0500) Subject: memory testing start X-Git-Tag: bootrom-initial-submission~26 X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=1f29900a4c6c69583511a51ee671528539027089;p=430.git memory testing start --- diff --git a/msp4th/Makefile b/msp4th/Makefile index 1ad3d46..0a20f6f 100644 --- a/msp4th/Makefile +++ b/msp4th/Makefile @@ -12,11 +12,12 @@ SHELL = /bin/bash TARGET = main #MCU = msp430f5529 -MCU = msp1 -#MCU = msp430x2013 +#MCU = msp1 +MCU = msp430x2013 # List all the source files here # eg if you have a source file foo.c then list it here SOURCES = main.c ns430-uart.c msp4th.c +#SOURCES = main.c ns430-uart.c # Include are located in the Include directory #INCLUDES = -IInclude INCLUDES = -I. @@ -24,6 +25,7 @@ INCLUDES = -I. ####################################################################################### #CFLAGS = -mmcu=$(MCU) -g -Os -Wall -Wunused $(INCLUDES) #CFLAGS = -mmcu=$(MCU) -Werror -Wall -Wunused -mendup-at=main $(INCLUDES) +#CFLAGS = -mmcu=$(MCU) -g -Os -Werror -Wall -Wunused $(INCLUDES) CFLAGS = -mmcu=$(MCU) -g -Os -Werror -Wall -Wunused $(INCLUDES) #ASFLAGS = -mmcu=$(MCU) -x assembler-with-cpp -Wa,-gstabs #ASFLAGS = -mmcu=$(MCU) -Wall -Wunused -mendup-at=main $(INCLUDES) diff --git a/msp4th/ldscript_ns430 b/msp4th/ldscript_ns430 index 8480b88..7a8168c 100644 --- a/msp4th/ldscript_ns430 +++ b/msp4th/ldscript_ns430 @@ -120,6 +120,7 @@ SECTIONS } > data PROVIDE (__data_load_start = LOADADDR(.data) ); PROVIDE (__data_size = SIZEOF(.data) ); + PROVIDE (__data_end = LOADADDR(.data) + SIZEOF(.data) ); /* Bootloader. */ .bootloader : { diff --git a/msp4th/main.c b/msp4th/main.c index 7a90957..1de6ef5 100644 --- a/msp4th/main.c +++ b/msp4th/main.c @@ -9,10 +9,9 @@ #define DEVBOARD_CLOCK 12000000L -#define BAUDRATE 4800L +#define BAUDRATE 19200L -/*NAKED(_reset_vector__){*/ void __attribute__ ((naked)) _reset_vector__(void) { __asm__ __volatile__("br #main"::); } @@ -35,12 +34,22 @@ static void __inline__ eint(void){ __asm__ __volatile__ ( "eint" :: ); } + + + + + int main(void){ uint16_t tmp; + volatile int16_t *dirMemory; + dirMemory = 0; + dint(); + + // chip setup for UART0 use PAPER = 0x0030; PAOUT = 0x0000; PAOEN = 0x0010; // set data direction registers @@ -48,11 +57,14 @@ int main(void){ UART0_BCR = BCR(DEVBOARD_CLOCK, BAUDRATE); UART0_CR = UARTEn; + // a read clears the register tmp = UART0_SR; - uart_putchar('!'); + + /* + uart_puts((uint8_t *)"UART echo mode, ` to exit:"); char c; while (1) { c = uart_getchar(); @@ -60,15 +72,106 @@ int main(void){ break; uart_putchar(c); } + */ + + + + /* + * dump contents of all RAM + */ + volatile uint16_t *addr; + + uart_puts((uint8_t *)"Memory dump:"); + uart_putchar('\r'); + uart_putchar('\n'); + + for (addr = (uint16_t *)0x4000; addr < (uint16_t *)0xfffe; addr++) { + printHexWord((int16_t)addr); + uart_putchar(' '); + printHexWord((int16_t)*addr); + uart_putchar('\r'); + uart_putchar('\n'); + } + + + + + + + /* + * memtest starting at end of program code + */ + + const int16_t patterns[] = { + 0x0000, + 0x0001, + 0x0002, + 0x0004, + 0x0008, + 0x0010, + 0x0020, + 0x0040, + 0x0080, + 0x0100, + 0x0200, + 0x0400, + 0x0800, + 0x1000, + 0x2000, + 0x4000, + 0x8000, + 0xaaaa, + 0x5555, + 0xffff, + 0x0000, + }; + + volatile int16_t idx; + volatile int16_t readback; + volatile int16_t pattern; + + const int16_t dend = (int16_t)0x51f0; + const int16_t memend = (int16_t)0xff80; + + uart_puts((uint8_t *)"*** Memtest patterns ***"); + + printHexWord((int16_t)dend); + uart_puts((uint8_t *)" -- start address"); + + printHexWord((int16_t)memend); + uart_puts((uint8_t *)" -- end address"); + + for (idx=0; idx < sizeof(patterns)/sizeof(int16_t); idx++) { + pattern = patterns[idx]; + + printHexWord(pattern); + uart_puts((uint8_t *)" -- write pattern"); + + // write pattern to all locations + for (addr = (uint16_t *)dend; addr < (uint16_t *)memend; addr++) { + *addr = (uint16_t)pattern; + } + + printHexWord(pattern); + uart_puts((uint8_t *)" -- readback pattern"); + + // readback pattern + for (addr = (uint16_t *)dend; addr < (uint16_t *)memend; addr++) { + readback = (int16_t)*addr; + + if (readback != pattern) { + printHexWord((int16_t)addr); + uart_putchar(' '); + printHexWord(pattern); + uart_putchar(' '); + printHexWord(readback); + uart_putchar('\r'); + uart_putchar('\n'); + } + } + } - uart_putchar('t'); - uart_putchar('e'); - uart_putchar('s'); - uart_putchar('t'); - uart_putchar('i'); - uart_putchar('n'); - uart_putchar('g'); - uart_puts((uint8_t *)"This is a test of the UART serial printing\r\nit really does work ...\r\n"); + uart_puts((uint8_t *)"*** Memtest done ***"); init_msp4th(); processLoop(); diff --git a/msp4th/msp4th.c b/msp4th/msp4th.c index 69694b3..4b84ad4 100644 --- a/msp4th/msp4th.c +++ b/msp4th/msp4th.c @@ -381,8 +381,8 @@ void getWord(void) wordBuffer[0] = 0; - uart_putchar('.'); - uart_putchar('.'); + /*uart_putchar('.');*/ + /*uart_putchar('.');*/ /*while (wordBuffer[0] == 0) {*/ waiting = 1; @@ -392,6 +392,7 @@ void getWord(void) while ((c <= ' ') && (c != 0)) { c = getKeyB(); /* strip leading spaces */ + uart_putchar('a'); /*uart_putchar(c);*/ } @@ -409,8 +410,9 @@ void getWord(void) /*}*/ /*} else {*/ while (c > ' ') { + uart_putchar('b'); wordBuffer[k++] = c; - uart_putchar(c); + /*uart_putchar(c);*/ c = getKeyB(); } /*}*/ @@ -418,6 +420,7 @@ void getWord(void) wordBuffer[k] = 0; waiting = 0; } else { + uart_putchar('c'); wordBuffer[0] = 0; getLine(); } @@ -438,14 +441,14 @@ int16_t popMathStack(void) k = 1; j = mathStack[0]; - uart_putchar('1'); - uart_putchar('2'); + /*uart_putchar('1');*/ + /*uart_putchar('2');*/ for (i=1;i 0; i--) { tmp = i - 1; mathStack[i] = mathStack[tmp]; @@ -556,7 +559,7 @@ void numFunc() volatile int16_t j; volatile int16_t n; - uart_puts((str_t *)"in numFunc()"); + /*uart_puts((str_t *)"in numFunc()");*/ // first check for neg sign i = 0; @@ -564,15 +567,15 @@ void numFunc() i = i + 1; } - uart_puts((str_t *)"there"); + /*uart_puts((str_t *)"there");*/ if ((wordBuffer[i] >= '0') && (wordBuffer[i] <= '9')) { - uart_puts((str_t *)"num"); + /*uart_puts((str_t *)"num");*/ // it is a number j = 1; // check if hex if(wordBuffer[0] == '0' && wordBuffer[1] == 'x'){ - uart_puts((str_t *)"hex"); + /*uart_puts((str_t *)"hex");*/ // base 16 number ... just assume all characters are good i = 2; n = 0; @@ -585,7 +588,7 @@ void numFunc() i = i + 1; } } else { - uart_puts((str_t *)"dec"); + /*uart_puts((str_t *)"dec");*/ // base 10 number n = 0; while(wordBuffer[i]){ @@ -598,16 +601,16 @@ void numFunc() } } } else { - uart_puts((str_t *)"not number"); + /*uart_puts((str_t *)"not number");*/ n = 0; j = 0; } - uart_putchar('.'); + /*uart_putchar('.');*/ pushMathStack(n); - uart_putchar('.'); + /*uart_putchar('.');*/ pushMathStack(j); - uart_putchar('.'); + /*uart_putchar('.');*/ } void ifFunc(int16_t x){ // used as goto if x == 1 @@ -615,7 +618,7 @@ void ifFunc(int16_t x){ // used as goto if x == 1 volatile uint16_t tmp; volatile int16_t i; - uart_puts((str_t *)"in ifFunc"); + /*uart_puts((str_t *)"in ifFunc");*/ if(progCounter > 9999){ tmp = progCounter - 10000; @@ -624,28 +627,28 @@ void ifFunc(int16_t x){ // used as goto if x == 1 addr = prog[progCounter]; } - printNumber(addr); - uart_puts((str_t *)"<-- addr"); + /*printNumber(addr);*/ + /*uart_puts((str_t *)"<-- addr");*/ progCounter = progCounter + 1; - uart_putchar('.'); + /*uart_putchar('.');*/ if(x == 1){ // this is a goto - uart_putchar('g'); + /*uart_putchar('g');*/ progCounter = addr; /*uart_puts((str_t *)"goto");*/ } else { // this is the "if" processing - uart_putchar('i'); + /*uart_putchar('i');*/ i = popMathStack(); /*uart_putchar('a');*/ /*printNumber((int16_t)addr);*/ if(i == 0){ progCounter = addr; } - uart_puts((str_t *)"<-- if"); + /*uart_puts((str_t *)"<-- if");*/ } - uart_putchar('.'); + /*uart_putchar('.');*/ } void pushnFunc(){ @@ -768,11 +771,13 @@ void execFunc(){ void execN(int16_t n){ volatile int16_t i,j,k,m; - int32_t x,y,z; - uart_puts((str_t *)"execN: "); - printNumber(n); - uart_puts((str_t *)""); + int16_t x,y,z; + /*uart_puts((str_t *)"execN: ");*/ + /*printNumber(n);*/ + /*uart_puts((str_t *)"");*/ switch(n){ + case 0: + break; case 1: // xit = 1; break; @@ -896,11 +901,11 @@ void execN(int16_t n){ ifFunc(0); break; -// case 23: // then ( trapped in ':') -// break; + case 23: // then ( trapped in ':') + break; -// case 24: // else ( trapped in ':') -// break; + case 24: // else ( trapped in ':') + break; case 25: // begin pushAddrStack(progCounter); @@ -925,9 +930,11 @@ void execN(int16_t n){ printHexWord(popMathStack()); break; + case 29: + break; case 30: // num - uart_puts((str_t *)"in case 30"); + /*uart_puts((str_t *)"in case 30");*/ numFunc(); break; @@ -1147,7 +1154,7 @@ void execN(int16_t n){ break; default: - uart_puts((str_t *)"opcode "); + /*uart_puts((str_t *)"opcode "); */ break; } } diff --git a/msp4th/msp4th.h b/msp4th/msp4th.h index 8f8a16f..15164c6 100644 --- a/msp4th/msp4th.h +++ b/msp4th/msp4th.h @@ -4,4 +4,25 @@ void init_msp4th(void); void processLoop(void); +uint8_t getKeyB(void); +void getLine(void); +void getWord(void); +void listFunction(void); +int16_t popMathStack(void); +void pushMathStack(int16_t n); +int16_t popAddrStack(void); +void pushAddrStack(int16_t n); +int16_t lookupToken(uint8_t *x, uint8_t *l); +void luFunc(void); +void numFunc(void); +void ifFunc(int16_t x); +void pushnFunc(void); +void overFunc(void); +void dfnFunc(void); +void printNumber(int16_t n); +void printHexChar(int16_t n); +void printHexByte(int16_t n); +void printHexWord(int16_t n); +void execN(int16_t n); +void execFunc(void); #endif