# HG changeset patch # User Michael Spacefalcon # Date 1367621728 0 # Node ID 24b88c119465e98044112eed192957a31d097129 # Parent 4c78fc68812788678234c877200b608e1464c847 loadtools: hw parameter file reading implemented diff -r 4c78fc688127 -r 24b88c119465 loadtools/Makefile --- a/loadtools/Makefile Fri May 03 07:27:53 2013 +0000 +++ b/loadtools/Makefile Fri May 03 22:55:28 2013 +0000 @@ -2,8 +2,8 @@ CFLAGS= -O2 PROGS= fc-sertool -SERTOOL_OBJS= hexdecode.o romload.o sercomm.o sertool.o srecreader.o \ - ttypassthru.o +SERTOOL_OBJS= defpath.o hexdecode.o hwparam.o romload.o sercomm.o sertool.o \ + srecreader.o ttypassthru.o all: ${PROGS} diff -r 4c78fc688127 -r 24b88c119465 loadtools/defpath.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loadtools/defpath.c Fri May 03 22:55:28 2013 +0000 @@ -0,0 +1,7 @@ +/* + * By default the loadagent.srec target utility and some hardware parameter + * files are sought in an installation directory, to make the more common + * command line operations more manageable. + */ + +char default_helpers_dir[] = "/usr/local/share/freecalypso"; diff -r 4c78fc688127 -r 24b88c119465 loadtools/hwparam.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loadtools/hwparam.c Fri May 03 22:55:28 2013 +0000 @@ -0,0 +1,159 @@ +/* + * This module contains the code that reads the hardware parameter files + * specified with -h or -H, and sets variables for later use by other code. + */ + +#include +#include +#include +#include +#include + +extern char default_helpers_dir[]; + +char hw_init_script[128]; + +static void +handle_init_script(arg, filename_for_errs, lineno_for_errs) + char *arg; + char *filename_for_errs; + int lineno_for_errs; +{ + char *cp; + + while (isspace(*arg)) + arg++; + if (!*arg) { + fprintf(stderr, + "%s line %d: init-script setting requires an argument\n", + filename_for_errs, lineno_for_errs); + exit(1); + } + for (cp = arg; *cp && !isspace(*cp); cp++) + ; + *cp = '\0'; + if (cp - arg > sizeof(hw_init_script) - 1) { + fprintf(stderr, + "%s line %d: init-script argument is too long (buffer overflow)\n", + filename_for_errs, lineno_for_errs); + exit(1); + } + strcpy(hw_init_script, arg); +} + +static void +handle_pll_config(arg, filename_for_errs, lineno_for_errs) + char *arg; + char *filename_for_errs; + int lineno_for_errs; +{ + int mult, div; + + while (isspace(*arg)) + arg++; + if (!isdigit(*arg)) { +inv: fprintf(stderr, "%s line %d: pll-config argument must be M/N\n", + filename_for_errs, lineno_for_errs); + exit(1); + } + mult = atoi(arg); + arg++; + if (isdigit(*arg)) + arg++; + if (*arg++ != '/') + goto inv; + if (!isdigit(*arg)) + goto inv; + div = atoi(arg); + arg++; + if (*arg && !isspace(*arg)) + goto inv; + if (mult < 0 || mult > 31 || div < 1 || div > 4) { + fprintf(stderr, + "%s line %d: pll-config argument is out of range\n", + filename_for_errs, lineno_for_errs); + exit(1); + } + set_romload_pll_conf((mult << 2) | (div - 1)); +} + +static void +handle_rhea_cntl(arg, filename_for_errs, lineno_for_errs) + char *arg; + char *filename_for_errs; + int lineno_for_errs; +{ + int byte; + + while (isspace(*arg)) + arg++; + if (arg[0] == '0' && (arg[1] == 'x' || arg[1] == 'X')) + arg += 2; + byte = decode_hex_byte(arg); + if (byte < 0 || arg[2] && !isspace(arg[2])) { + fprintf(stderr, + "%s line %d: rhea-cntl argument must be a hex byte value\n", + filename_for_errs, lineno_for_errs); + exit(1); + } + set_romload_rhea_cntl(byte); +} + +static struct cmdtab { + char *name; + void (*func)(); +} cmdtab[] = { + {"init-script", handle_init_script}, + {"pll-config", handle_pll_config}, + {"rhea-cntl", handle_rhea_cntl}, + {0, 0} +}; + +void +read_hwparam_file_fullpath(filename) + char *filename; +{ + FILE *f; + char linebuf[512]; + int lineno; + char *cp, *np; + struct cmdtab *tp; + + f = fopen(filename, "r"); + if (!f) { + perror(filename); + exit(1); + } + for (lineno = 1; fgets(linebuf, sizeof linebuf, f); lineno++) { + for (cp = linebuf; isspace(*cp); cp++) + ; + if (!*cp || *cp == '#') + continue; + for (np = cp; *cp && !isspace(*cp); cp++) + ; + if (*cp) + *cp++ = '\0'; + for (tp = cmdtab; tp->name; tp++) + if (!strcmp(tp->name, np)) + break; + if (tp->func) + tp->func(cp, filename, lineno); + else { + fprintf(stderr, + "%s line %d: setting \"%s\" not understood\n", + filename, lineno, np); + exit(1); + } + } + fclose(f); +} + +void +read_hwparam_file_shortname(confname) + char *confname; +{ + char pathname[MAXPATHLEN]; + + sprintf(pathname, "%s/%s.config", default_helpers_dir, confname); + read_hwparam_file_fullpath(pathname); +} diff -r 4c78fc688127 -r 24b88c119465 loadtools/romload.c --- a/loadtools/romload.c Fri May 03 07:27:53 2013 +0000 +++ b/loadtools/romload.c Fri May 03 22:55:28 2013 +0000 @@ -67,6 +67,20 @@ beacon_interval = i; } +/* + * The following functions alter some of the parameters sent to the + * boot ROM in the