view ee2232/ee2232-prog.c @ 104:a60645b75a57

fc-simtool: phonebook dump implemented
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 25 Jan 2021 05:55:40 +0000
parents a85b6b7398bc
children
line wrap: on
line source

#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>

char *device_selector = "i:0x0403:0x6010";
unsigned eeprom_size = 64;
u_short eeprom[256];
int erase;

process_cmdline(argc, argv)
	char **argv;
{
	int c;
	extern char *optarg;

	while ((c = getopt(argc, argv, "d:et:")) != EOF) {
		switch (c) {
		case 'd':
			device_selector = optarg;
			continue;
		case 'e':
			erase = 1;
			continue;
		case 't':
			if (!strcmp(optarg, "46"))
				eeprom_size = 64;
			else if (!strcmp(optarg, "56"))
				eeprom_size = 128;
			else if (!strcmp(optarg, "66"))
				eeprom_size = 256;
			else {
				fprintf(stderr,
				"error: -t option invalid value \"%s\"\n",
					optarg);
				exit(1);
			}
			continue;
		default:
			/* error msg already printed */
			exit(1);
		}
	}
}

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

main(argc, argv)
	char **argv;
{
	struct ftdi_context ftdi;
	unsigned n;

	process_cmdline(argc, argv);
	if (erase)
		memset(eeprom, 0xFF, eeprom_size * 2);
	else
		read_eeprom_from_stdin();
	ftdi_init(&ftdi);
	if (ftdi_usb_open_string(&ftdi, device_selector) < 0) {
		fprintf(stderr, "FTDI USB open 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);
}