FreeCalypso > hg > freecalypso-hwlab
changeset 47:2c092eb1621b
fteeprom-prog revamped: read from file or stdin, comments allowed,
size determined from data (no more -b|-B), no more -e
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 22 Apr 2019 20:10:05 +0000 |
parents | e5d89313bc00 |
children | af70c59654ed |
files | fteeprom/fteeprom-prog.c |
diffstat | 1 files changed, 55 insertions(+), 43 deletions(-) [+] |
line wrap: on
line diff
--- a/fteeprom/fteeprom-prog.c Mon Apr 22 19:44:57 2019 +0000 +++ b/fteeprom/fteeprom-prog.c Mon Apr 22 20:10:05 2019 +0000 @@ -7,57 +7,65 @@ #include <unistd.h> #include <ftdi.h> -char *device_selector; -unsigned eeprom_size = 64; +unsigned eeprom_size; u_short eeprom[256]; -int erase; - -process_cmdline(argc, argv) - char **argv; -{ - int c; - extern int optind; - while ((c = getopt(argc, argv, "bBe")) != EOF) { - switch (c) { - case 'b': - eeprom_size = 128; +read_eeprom_common(inf, filename_for_errs) + FILE *inf; + char *filename_for_errs; +{ + char linebuf[1024], *cp; + int lineno, rc; + unsigned ptr = 0, input_off; + + for (lineno = 1; fgets(linebuf, sizeof linebuf, inf); lineno++) { + for (cp = linebuf; isspace(*cp); cp++) + ; + if (*cp == '\0' || *cp == '#') continue; - case 'B': - eeprom_size = 256; - continue; - case 'e': - erase = 1; - continue; - default: - /* error msg already printed */ + if (ptr >= 256) { + fprintf(stderr, + "%s line %d: maximum EEPROM size exceeded\n", + filename_for_errs, lineno); exit(1); } + rc = sscanf(linebuf, "%x: %hx %hx %hx %hx %hx %hx %hx %hx", + &input_off, eeprom + ptr, eeprom + ptr + 1, + eeprom + ptr + 2, eeprom + ptr + 3, + eeprom + ptr + 4, eeprom + ptr + 5, + eeprom + ptr + 6, eeprom + ptr + 7); + if (rc != 9 || input_off != ptr * 2) { + fprintf(stderr, "%s line %d: invalid input\n", + filename_for_errs, lineno); + exit(1); + } + ptr += 8; } - if (argc != optind + 1) { - fprintf(stderr, "usage: %s [options] device-selector\n", - argv[0]); + if (ptr != 64 && ptr != 128 && ptr != 256) { + fprintf(stderr, "%s: not an EEPROM image of recognized size\n", + filename_for_errs); exit(1); } - device_selector = argv[optind]; + eeprom_size = ptr; +} + +read_eeprom_from_file(filename) + char *filename; +{ + FILE *inf; + + inf = fopen(filename, "r"); + if (!inf) { + perror(filename); + exit(1); + } + read_eeprom_common(inf, filename); + fclose(inf); } read_eeprom_from_stdin() { - unsigned n, off; - int rc; - - for (n = 0; n < eeprom_size; n += 8) { - rc = scanf("%x: %hx %hx %hx %hx %hx %hx %hx %hx", &off, - eeprom + n, eeprom + n + 1, eeprom + n + 2, - eeprom + n + 3, eeprom + n + 4, eeprom + n + 5, - eeprom + n + 6, eeprom + n + 7); - if (rc != 9 || off != n * 2) { - fprintf(stderr, - "ee2232-prog error: invalid input on stdin\n"); - exit(1); - } - } + read_eeprom_common(stdin, "stdin"); } main(argc, argv) @@ -66,13 +74,17 @@ struct ftdi_context ftdi; unsigned n; - process_cmdline(argc, argv); - if (erase) - memset(eeprom, 0xFF, eeprom_size * 2); + if (argc < 2 || argc > 3) { + fprintf(stderr, "usage: %s device-selector [eeprom-image]\n", + argv[0]); + exit(1); + } + if (argv[2]) + read_eeprom_from_file(argv[2]); else read_eeprom_from_stdin(); ftdi_init(&ftdi); - if (ftdi_usb_open_string(&ftdi, device_selector) < 0) { + if (ftdi_usb_open_string(&ftdi, argv[1]) < 0) { fprintf(stderr, "FTDI USB open failed: %s\n", ftdi.error_str); exit(1); }