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);
 	}