FreeCalypso > hg > fc-usbser-tools
diff fteeprom/fteeprom-prog.c @ 0:11b8a30333b3
fteeprom: initial import from freecalypso-hwlab
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 03 Sep 2023 18:08:22 +0000 |
parents | |
children | 43b8e88dae02 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fteeprom/fteeprom-prog.c Sun Sep 03 18:08:22 2023 +0000 @@ -0,0 +1,117 @@ +#include <sys/types.h> +#include <ctype.h> +#include <string.h> +#include <strings.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <ftdi.h> + +unsigned eeprom_size; +u_short eeprom[256]; + +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; + 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 (ptr != 64 && ptr != 128 && ptr != 256) { + fprintf(stderr, "%s: not an EEPROM image of recognized size\n", + filename_for_errs); + exit(1); + } + 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() +{ + read_eeprom_common(stdin, "stdin"); +} + +main(argc, argv) + char **argv; +{ + struct ftdi_context ftdi; + u_short modem_status; + unsigned n; + + 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, argv[1]) < 0) { + fprintf(stderr, "FTDI USB open failed: %s\n", ftdi.error_str); + exit(1); + } + /* magic sequence apparently required for FT232R */ + if (ftdi_usb_reset(&ftdi) < 0) { + fprintf(stderr, "ftdi_usb_reset() failed: %s\n", + ftdi.error_str); + exit(1); + } + if (ftdi_poll_modem_status(&ftdi, &modem_status) < 0) { + fprintf(stderr, "ftdi_poll_modem_status() failed: %s\n", + ftdi.error_str); + exit(1); + } + if (ftdi_set_latency_timer(&ftdi, 0x77) < 0) { + fprintf(stderr, "ftdi_set_latency_timer() failed: %s\n", + ftdi.error_str); + exit(1); + } + for (n = 0; n < eeprom_size; n++) { + if (ftdi_write_eeprom_location(&ftdi, n, eeprom[n]) < 0) { + fprintf(stderr, "EEPROM write error: %s\n", + ftdi.error_str); + exit(1); + } + } + ftdi_usb_close(&ftdi); + exit(0); +}