From aea1a6695603bd138226d617d95ed82f463e9fe7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20Fr=C3=B6schle?= Date: Fri, 26 Dec 2014 12:31:44 +0000 Subject: [PATCH] do first tests with FPGA config. SDRAM doesn't seem to work, reading and writing of Firebee CLUT does work, hovever. --- BaS_gcc/tos/vmem_test/sources/bas_printf.c | 550 ++++++++++----------- BaS_gcc/tos/vmem_test/sources/bas_string.c | 132 ++--- BaS_gcc/tos/vmem_test/sources/vmem_test.c | 65 ++- 3 files changed, 386 insertions(+), 361 deletions(-) diff --git a/BaS_gcc/tos/vmem_test/sources/bas_printf.c b/BaS_gcc/tos/vmem_test/sources/bas_printf.c index bfe67ac..d0d2f30 100644 --- a/BaS_gcc/tos/vmem_test/sources/bas_printf.c +++ b/BaS_gcc/tos/vmem_test/sources/bas_printf.c @@ -1,7 +1,7 @@ /* * tc.printf.c: A public-domain, minimal printf/sprintf routine that prints - * through the putchar() routine. Feel free to use for - * anything... -- 7/17/87 Paul Placeway + * through the putchar() routine. Feel free to use for + * anything... -- 7/17/87 Paul Placeway */ /*- * Copyright (c) 1980, 1991 The Regents of the University of California. @@ -44,165 +44,165 @@ * The eighth/sixteenth bit of characters is used to prevent recognition, * and eventually stripped. */ -#define META 0200 -#define ASCII 0177 -#define QUOTE ((char) 0200) /* Eighth char bit used for 'ing */ -#define TRIM 0177 /* Mask to strip quote bit */ -#define UNDER 0000000 /* No extra bits to do both */ -#define BOLD 0000000 /* Bold flag */ -#define STANDOUT META /* Standout flag */ -#define LITERAL 0000000 /* Literal character flag */ -#define ATTRIBUTES 0200 /* The bits used for attributes */ -#define CHAR 0000177 /* Mask to mask out the character */ +#define META 0200 +#define ASCII 0177 +#define QUOTE ((char) 0200) /* Eighth char bit used for 'ing */ +#define TRIM 0177 /* Mask to strip quote bit */ +#define UNDER 0000000 /* No extra bits to do both */ +#define BOLD 0000000 /* Bold flag */ +#define STANDOUT META /* Standout flag */ +#define LITERAL 0000000 /* Literal character flag */ +#define ATTRIBUTES 0200 /* The bits used for attributes */ +#define CHAR 0000177 /* Mask to mask out the character */ -#define INF 32766 /* should be bigger than any field to print */ +#define INF 32766 /* should be bigger than any field to print */ static char snil[] = "(nil)"; void xputchar(int c) { - __asm__ __volatile__ - ( - ".extern printf_helper\n\t" - "move.b %0,d0\n\t" - "bsr printf_helper\n\t" - /* output */: - /* input */: "r" (c) - /* clobber */: "d0","d2","a0","memory" - ); + __asm__ __volatile__ + ( + ".extern printf_helper\n\t" + "move.b %0,d0\n\t" + "bsr printf_helper\n\t" + /* output */: + /* input */: "r" (c) + /* clobber */: "d0","d2","a0","memory" + ); } static void doprnt(void (*addchar)(int), const char *sfmt, va_list ap) { - char buf[128]; - char *bp; - const char *f; - float flt; - long l; - unsigned long u; - int i; - int fmt; - unsigned char pad = ' '; - int flush_left = 0; - int f_width = 0; - int prec = INF; - int hash = 0; - int do_long = 0; - int sign = 0; - int attributes = 0; + char buf[128]; + char *bp; + const char *f; + float flt; + long l; + unsigned long u; + int i; + int fmt; + unsigned char pad = ' '; + int flush_left = 0; + int f_width = 0; + int prec = INF; + int hash = 0; + int do_long = 0; + int sign = 0; + int attributes = 0; - f = sfmt; - for (; *f; f++) - { - if (*f != '%') - { - /* then just out the char */ - (*addchar)((int) (((unsigned char) *f) | attributes)); - } - else - { - f++; /* skip the % */ + f = sfmt; + for (; *f; f++) + { + if (*f != '%') + { + /* then just out the char */ + (*addchar)((int) (((unsigned char) *f) | attributes)); + } + else + { + f++; /* skip the % */ - if (*f == '-') - { /* minus: flush left */ - flush_left = 1; - f++; - } + if (*f == '-') + { /* minus: flush left */ + flush_left = 1; + f++; + } - if (*f == '0' || *f == '.') - { - /* padding with 0 rather than blank */ - pad = '0'; - f++; - } - if (*f == '*') - { - /* field width */ - f_width = va_arg(ap, int); - f++; - } - else if (isdigit((unsigned char)*f)) - { - f_width = atoi(f); - while (isdigit((unsigned char)*f)) - f++; /* skip the digits */ - } + if (*f == '0' || *f == '.') + { + /* padding with 0 rather than blank */ + pad = '0'; + f++; + } + if (*f == '*') + { + /* field width */ + f_width = va_arg(ap, int); + f++; + } + else if (isdigit((unsigned char)*f)) + { + f_width = atoi(f); + while (isdigit((unsigned char)*f)) + f++; /* skip the digits */ + } - if (*f == '.') - { /* precision */ - f++; - if (*f == '*') - { - prec = va_arg(ap, int); - f++; - } - else if (isdigit((unsigned char)*f)) - { - prec = atoi(f); - while (isdigit((unsigned char)*f)) - f++; /* skip the digits */ - } - } + if (*f == '.') + { /* precision */ + f++; + if (*f == '*') + { + prec = va_arg(ap, int); + f++; + } + else if (isdigit((unsigned char)*f)) + { + prec = atoi(f); + while (isdigit((unsigned char)*f)) + f++; /* skip the digits */ + } + } - if (*f == '#') - { /* alternate form */ - hash = 1; - f++; - } + if (*f == '#') + { /* alternate form */ + hash = 1; + f++; + } - if (*f == 'l') - { /* long format */ - do_long++; - f++; - if (*f == 'l') - { - do_long++; - f++; - } - } + if (*f == 'l') + { /* long format */ + do_long++; + f++; + if (*f == 'l') + { + do_long++; + f++; + } + } - fmt = (unsigned char) *f; - if (fmt != 'S' && fmt != 'Q' && isupper(fmt)) - { - do_long = 1; - fmt = tolower(fmt); - } - bp = buf; - switch (fmt) - { /* do the format */ - case 'd': - switch (do_long) - { - case 0: - l = (long) (va_arg(ap, int)); - break; - case 1: - default: - l = va_arg(ap, long); - break; - } + fmt = (unsigned char) *f; + if (fmt != 'S' && fmt != 'Q' && isupper(fmt)) + { + do_long = 1; + fmt = tolower(fmt); + } + bp = buf; + switch (fmt) + { /* do the format */ + case 'd': + switch (do_long) + { + case 0: + l = (long) (va_arg(ap, int)); + break; + case 1: + default: + l = va_arg(ap, long); + break; + } - if (l < 0) - { - sign = 1; - l = -l; - } - do - { - *bp++ = (char) (l % 10) + '0'; - } while ((l /= 10) > 0); - if (sign) - *bp++ = '-'; - f_width = f_width - (int) (bp - buf); - if (!flush_left) - while (f_width-- > 0) - (*addchar)((int) (pad | attributes)); - for (bp--; bp >= buf; bp--) - (*addchar)((int) (((unsigned char) *bp) | attributes)); - if (flush_left) - while (f_width-- > 0) - (*addchar)((int) (' ' | attributes)); - break; + if (l < 0) + { + sign = 1; + l = -l; + } + do + { + *bp++ = (char) (l % 10) + '0'; + } while ((l /= 10) > 0); + if (sign) + *bp++ = '-'; + f_width = f_width - (int) (bp - buf); + if (!flush_left) + while (f_width-- > 0) + (*addchar)((int) (pad | attributes)); + for (bp--; bp >= buf; bp--) + (*addchar)((int) (((unsigned char) *bp) | attributes)); + if (flush_left) + while (f_width-- > 0) + (*addchar)((int) (' ' | attributes)); + break; case 'f': /* this is actually more than stupid, but does work for now */ @@ -242,179 +242,179 @@ static void doprnt(void (*addchar)(int), const char *sfmt, va_list ap) } break; - case 'p': - do_long = 1; - hash = 1; - fmt = 'x'; - /* no break */ - case 'o': - case 'x': - case 'u': - switch (do_long) - { - case 0: - u = (unsigned long) (va_arg(ap, unsigned int)); - break; - case 1: - default: - u = va_arg(ap, unsigned long); - break; - } - if (fmt == 'u') - { /* unsigned decimal */ - do - { - *bp++ = (char) (u % 10) + '0'; - } while ((u /= 10) > 0); - } - else if (fmt == 'o') - { /* octal */ - do - { - *bp++ = (char) (u % 8) + '0'; - } while ((u /= 8) > 0); - if (hash) - *bp++ = '0'; - } - else if (fmt == 'x') - { /* hex */ - do - { - i = (int) (u % 16); - if (i < 10) - *bp++ = i + '0'; - else - *bp++ = i - 10 + 'a'; - } while ((u /= 16) > 0); - if (hash) - { - *bp++ = 'x'; - *bp++ = '0'; - } - } - i = f_width - (int) (bp - buf); - if (!flush_left) - while (i-- > 0) - (*addchar)((int) (pad | attributes)); - for (bp--; bp >= buf; bp--) - (*addchar)((int) (((unsigned char) *bp) | attributes)); - if (flush_left) - while (i-- > 0) - (*addchar)((int) (' ' | attributes)); - break; + case 'p': + do_long = 1; + hash = 1; + fmt = 'x'; + /* no break */ + case 'o': + case 'x': + case 'u': + switch (do_long) + { + case 0: + u = (unsigned long) (va_arg(ap, unsigned int)); + break; + case 1: + default: + u = va_arg(ap, unsigned long); + break; + } + if (fmt == 'u') + { /* unsigned decimal */ + do + { + *bp++ = (char) (u % 10) + '0'; + } while ((u /= 10) > 0); + } + else if (fmt == 'o') + { /* octal */ + do + { + *bp++ = (char) (u % 8) + '0'; + } while ((u /= 8) > 0); + if (hash) + *bp++ = '0'; + } + else if (fmt == 'x') + { /* hex */ + do + { + i = (int) (u % 16); + if (i < 10) + *bp++ = i + '0'; + else + *bp++ = i - 10 + 'a'; + } while ((u /= 16) > 0); + if (hash) + { + *bp++ = 'x'; + *bp++ = '0'; + } + } + i = f_width - (int) (bp - buf); + if (!flush_left) + while (i-- > 0) + (*addchar)((int) (pad | attributes)); + for (bp--; bp >= buf; bp--) + (*addchar)((int) (((unsigned char) *bp) | attributes)); + if (flush_left) + while (i-- > 0) + (*addchar)((int) (' ' | attributes)); + break; - case 'c': - i = va_arg(ap, int); - (*addchar)((int) (i | attributes)); - break; + case 'c': + i = va_arg(ap, int); + (*addchar)((int) (i | attributes)); + break; - case 'S': - case 'Q': - case 's': - case 'q': - bp = va_arg(ap, char *); - if (!bp) - bp = snil; - f_width = f_width - strlen((char *) bp); - if (!flush_left) - while (f_width-- > 0) - (*addchar)((int) (pad | attributes)); - for (i = 0; *bp && i < prec; i++) - { - if (fmt == 'q' && (*bp & QUOTE)) - (*addchar)((int) ('\\' | attributes)); - (*addchar)( - (int) (((unsigned char) *bp & TRIM) | attributes)); - bp++; - } - if (flush_left) - while (f_width-- > 0) - (*addchar)((int) (' ' | attributes)); - break; + case 'S': + case 'Q': + case 's': + case 'q': + bp = va_arg(ap, char *); + if (!bp) + bp = snil; + f_width = f_width - strlen((char *) bp); + if (!flush_left) + while (f_width-- > 0) + (*addchar)((int) (pad | attributes)); + for (i = 0; *bp && i < prec; i++) + { + if (fmt == 'q' && (*bp & QUOTE)) + (*addchar)((int) ('\\' | attributes)); + (*addchar)( + (int) (((unsigned char) *bp & TRIM) | attributes)); + bp++; + } + if (flush_left) + while (f_width-- > 0) + (*addchar)((int) (' ' | attributes)); + break; - case 'a': - attributes = va_arg(ap, int); - break; + case 'a': + attributes = va_arg(ap, int); + break; - case '%': - (*addchar)((int) ('%' | attributes)); - break; + case '%': + (*addchar)((int) ('%' | attributes)); + break; - default: - break; - } - flush_left = 0, f_width = 0, prec = INF, hash = 0, do_long = 0; - sign = 0; - pad = ' '; - } - } + default: + break; + } + flush_left = 0, f_width = 0, prec = INF, hash = 0, do_long = 0; + sign = 0; + pad = ' '; + } + } } static char *xstring, *xestring; void xaddchar(int c) { - if (xestring == xstring) - *xstring = '\0'; - else - *xstring++ = (char) c; + if (xestring == xstring) + *xstring = '\0'; + else + *xstring++ = (char) c; } int sprintf(char *str, const char *format, ...) { - va_list va; - va_start(va, format); + va_list va; + va_start(va, format); - xstring = str; + xstring = str; - doprnt(xaddchar, format, va); - va_end(va); - *xstring++ = '\0'; + doprnt(xaddchar, format, va); + va_end(va); + *xstring++ = '\0'; - return 0; + return 0; } void xsnprintf(char *str, size_t size, const char *fmt, ...) { - va_list va; - va_start(va, fmt); + va_list va; + va_start(va, fmt); - xstring = str; - xestring = str + size - 1; - doprnt(xaddchar, fmt, va); - va_end(va); - *xstring++ = '\0'; + xstring = str; + xestring = str + size - 1; + doprnt(xaddchar, fmt, va); + va_end(va); + *xstring++ = '\0'; } void xprintf(const char *fmt, ...) { - va_list va; - va_start(va, fmt); - doprnt(xputchar, fmt, va); - va_end(va); + va_list va; + va_start(va, fmt); + doprnt(xputchar, fmt, va); + va_end(va); } void xvprintf(const char *fmt, va_list va) { - doprnt(xputchar, fmt, va); + doprnt(xputchar, fmt, va); } void xvsnprintf(char *str, size_t size, const char *fmt, va_list va) { - xstring = str; - xestring = str + size - 1; - doprnt(xaddchar, fmt, va); - *xstring++ = '\0'; + xstring = str; + xestring = str + size - 1; + doprnt(xaddchar, fmt, va); + *xstring++ = '\0'; } void display_progress() { - static int _progress_index; - char progress_char[] = "|/-\\"; + static int _progress_index; + char progress_char[] = "|/-\\"; - xputchar(progress_char[_progress_index++ % strlen(progress_char)]); - xputchar('\r'); + xputchar(progress_char[_progress_index++ % strlen(progress_char)]); + xputchar('\r'); } void hexdump(uint8_t buffer[], int size) diff --git a/BaS_gcc/tos/vmem_test/sources/bas_string.c b/BaS_gcc/tos/vmem_test/sources/bas_string.c index 3960638..b8d6a0f 100644 --- a/BaS_gcc/tos/vmem_test/sources/bas_string.c +++ b/BaS_gcc/tos/vmem_test/sources/bas_string.c @@ -26,131 +26,131 @@ void *memcpy(void *dst, const void *src, size_t n) { - uint8_t *to = dst; + uint8_t *to = dst; - while (to < (uint8_t *) dst + n) - *to++ = * (uint8_t *) src++; + while (to < (uint8_t *) dst + n) + *to++ = * (uint8_t *) src++; - return dst; + return dst; } void bzero(void *s, size_t n) { - size_t i; + size_t i; - for (i = 0; i < n; i++) - ((unsigned char *) s)[i] = '\0'; + for (i = 0; i < n; i++) + ((unsigned char *) s)[i] = '\0'; } void *memset(void *s, int c, size_t n) { - uint8_t *dst = s; + uint8_t *dst = s; - do - { - *dst++ = c; - } while ((dst - (uint8_t *) s) < n); + do + { + *dst++ = c; + } while ((dst - (uint8_t *) s) < n); - return s; + return s; } int memcmp(const void *s1, const void *s2, size_t max) { - int i; - int cmp; + int i; + int cmp; - for (i = 0; i < max; i++) - { + for (i = 0; i < max; i++) + { cmp = (* (const char *) s1 - * (const char *) s2); - if (cmp != 0) return cmp; - } - return cmp; + if (cmp != 0) return cmp; + } + return cmp; } int strcmp(const char *s1, const char *s2) { - int i; - int cmp; + int i; + int cmp; - for (i = 0; *s1++ && *s2++; i++) - { - cmp = (*s1 - *s2); - if (cmp != 0) return cmp; - } - return cmp; + for (i = 0; *s1++ && *s2++; i++) + { + cmp = (*s1 - *s2); + if (cmp != 0) return cmp; + } + return cmp; } int strncmp(const char *s1, const char *s2, size_t max) { - int i; - int cmp; + int i; + int cmp; - for (i = 0; i < max && *s1++ && *s2++; i++); - { - cmp = (*s1 - *s2); - if (cmp != 0) return cmp; - } - return cmp; + for (i = 0; i < max && *s1++ && *s2++; i++); + { + cmp = (*s1 - *s2); + if (cmp != 0) return cmp; + } + return cmp; } char *strcpy(char *dst, const char *src) { - char *ptr = dst; + char *ptr = dst; - while ((*dst++ = *src++) != '\0'); - return ptr; + while ((*dst++ = *src++) != '\0'); + return ptr; } char *strncpy(char *dst, const char *src, size_t max) { - char *ptr = dst; + char *ptr = dst; - while ((*dst++ = *src++) != '\0' && max-- >= 0); - return ptr; + while ((*dst++ = *src++) != '\0' && max-- >= 0); + return ptr; } int atoi(const char *c) { - int value = 0; - while (isdigit(*c)) - { - value *= 10; - value += (int) (*c - '0'); - c++; - } - return value; + int value = 0; + while (isdigit(*c)) + { + value *= 10; + value += (int) (*c - '0'); + c++; + } + return value; } size_t strlen(const char *s) { - const char *start = s; + const char *start = s; - while (*s++); + while (*s++); - return s - start - 1; + return s - start - 1; } char *strcat(char *dst, const char *src) { - char *ret = dst; - dst = &dst[strlen(dst)]; - while ((*dst++ = *src++) != '\0'); - return ret; + char *ret = dst; + dst = &dst[strlen(dst)]; + while ((*dst++ = *src++) != '\0'); + return ret; } char *strncat(char *dst, const char *src, size_t max) { - size_t i; - char *ret = dst; + size_t i; + char *ret = dst; - dst = &dst[strlen(dst)]; - for (i = 0; i < max && *src; i++) - { - *dst++ = *src++; - } - *dst++ = '\0'; + dst = &dst[strlen(dst)]; + for (i = 0; i < max && *src; i++) + { + *dst++ = *src++; + } + *dst++ = '\0'; - return ret; + return ret; } diff --git a/BaS_gcc/tos/vmem_test/sources/vmem_test.c b/BaS_gcc/tos/vmem_test/sources/vmem_test.c index 46ac1fd..2d4bacb 100644 --- a/BaS_gcc/tos/vmem_test/sources/vmem_test.c +++ b/BaS_gcc/tos/vmem_test/sources/vmem_test.c @@ -7,11 +7,6 @@ #include "MCF5475.h" #include "driver_vec.h" -extern long _FPGA_JTAG_LOADED; -extern long _FPGA_JTAG_VALID; - -#define VALID_JTAG 0xaffeaffe - #define FPGA_CONFIG (1 << 2) #define FPGA_CONF_DONE (1 << 5) @@ -22,8 +17,47 @@ extern long _FPGA_JTAG_VALID; #define NOP() __asm__ __volatile__("nop\n\t" : : : "memory") long bas_start = 0xe0000000; -volatile uint32_t *_VRAM = (uint32_t *) 0x60000000; +volatile uint32_t *_VRAM = (uint32_t *) 0x40000000; +void do_tests(void) +{ + /* read out shifter registers */ + unsigned char * _vmem_hi = (unsigned char *) 0xffff8201; + unsigned char * _vmem_mid = (unsigned char *) 0xffff8203; + unsigned char * _vmem_lo = (unsigned char *) 0xffff820d; + + xprintf("vmem_hi = %x\r\n", *_vmem_hi); + xprintf("vmem_mid = %x\r\n", *_vmem_mid); + xprintf("vmem_lo = %x\r\n", *_vmem_lo); + + /* try to write to them */ + + xprintf("trying to write to _vbas\r\n"); + + *_vmem_hi = 0xd0; + *_vmem_mid = 0x00; + *_vmem_lo = 0x00; + + xprintf("read back values\r\n"); + + xprintf("vmem_hi = %x\r\n", *_vmem_hi); + xprintf("vmem_mid = %x\r\n", *_vmem_mid); + xprintf("vmem_lo = %x\r\n", *_vmem_lo); + + xprintf("read Firebee clut\r\n"); + + hexdump((uint8_t *) 0xf0000000, 0x400); + + xprintf("set Firebee clut\r\n"); + + int i; + for (i = 0; i < 0x400; i++) + { + * (unsigned char *) (0xf0000000 + i) = (uint8_t) i; + } + + hexdump((uint8_t *) 0xf0000000, 0x400); +} void wait_for_jtag(void) { @@ -69,29 +103,20 @@ void wait_for_jtag(void) while (!(MCF_GPIO_PPDSDR_FEC1L & FPGA_CONF_DONE)); /* wait for JTAG config load finished */ xprintf("JTAG configuration finished.\r\n"); - _FPGA_JTAG_LOADED = 1; /* indicate jtag loaded FPGA config to BaS */ - _FPGA_JTAG_VALID = VALID_JTAG; /* set magic word to indicate _FPGA_JTAG_LOADED is valid */ /* wait */ xprintf("wait a little to let things settle...\r\n"); for (i = 0; i < 10000000; i++); - xprintf("write byte data to FPGA memory\r\n"); - for (i = 0; i < 512; i++) - { - _VRAM[i] = i; - } - hexdump((uint8_t *) _VRAM, 512); + /* begin of tests */ + do_tests(); xprintf("wait a little to let things settle...\r\n"); for (i = 0; i < 10000000; i++); - __asm__ __volatile__( - " jmp (%[bas_start])\n\t" - : /* no output */ - : [bas_start] "a" (bas_start) - : /* clobber not needed */ - ); + xprintf("INFO: endless loop now. Press reset to reboot\r\n"); + while (1) + ; } int main(int argc, char *argv[])