FreeCalypso > hg > freecalypso-tools
diff loadtools/hwparam.c @ 0:e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 11 Jun 2016 00:13:35 +0000 |
parents | |
children | 0dd2c87c1b63 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loadtools/hwparam.c Sat Jun 11 00:13:35 2016 +0000 @@ -0,0 +1,190 @@ +/* + * 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 <sys/param.h> +#include <stdio.h> +#include <ctype.h> +#include <string.h> +#include <strings.h> +#include <stdlib.h> + +extern char default_helpers_dir[]; + +extern void set_boot_reflash_hack(); +extern void set_default_exit_mode(); +extern void set_flash_device(); + +char hw_init_script[128]; + +static void +handle_compal_stage(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: compal-stage setting requires an argument\n", + filename_for_errs, lineno_for_errs); + exit(1); + } + for (cp = arg; *cp && !isspace(*cp); cp++) + ; + *cp = '\0'; + set_compalstage_short(arg); +} + +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[] = { + {"boot-reflash-hack", set_boot_reflash_hack}, + {"compal-stage", handle_compal_stage}, + {"exit-mode", set_default_exit_mode}, + {"flash", set_flash_device}, + {"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); +}