# HG changeset patch # User Mychaela Falconia # Date 1693764568 0 # Node ID ab2bb12ec959601925d1639287ac2e8e38b02495 # Parent 11b8a30333b32fe2a74f06cdea6e0576310d1633 fteeprom/test: import from freecalypso-hwlab diff -r 11b8a30333b3 -r ab2bb12ec959 fteeprom/test/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fteeprom/test/Makefile Sun Sep 03 18:09:28 2023 +0000 @@ -0,0 +1,11 @@ +CC= gcc +CFLAGS= -O2 +PROGS= fteeprom-prog-bad + +all: ${PROGS} + +fteeprom-prog-bad: fteeprom-prog-bad.c + ${CC} ${CFLAGS} -o $@ $@.c -lftdi + +clean: + rm -f ${PROGS} *.o *errs *.out diff -r 11b8a30333b3 -r ab2bb12ec959 fteeprom/test/fteeprom-prog-bad.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fteeprom/test/fteeprom-prog-bad.c Sun Sep 03 18:09:28 2023 +0000 @@ -0,0 +1,123 @@ +/* + * This "bad" version of fteeprom-prog is being presented in order to show + * what happens on FT232R chips when a certain magic sequence is omitted. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +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); + } +#if 0 /* FT232R magic sequence omitted! */ + 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); + } +#endif + 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); +}