view fteeprom/fteeprom-read.c @ 68:5cbde3c80c24

fteeprom-{erase,prog}: detach logic: change to detach by default As it turns out, detaching all ttyUSB interfaces of a multichannel device does not require outside knowledge of how many channels there are, as in our previous -d option design that is being removed here - instead we can read the bNumInterfaces constant from the USB device's config descriptor and thus know how many interfaces there are in total. Based on this discovery, change the design of fteeprom-{erase,prog} as follows: * remove -d option; * flip the default to where we detach all interfaces by default; * add -n option to NOT detach any interfaces.
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 13 Sep 2023 06:37:03 +0000
parents bb1d0956b0a8
children
line wrap: on
line source

/*
 * This program connects to an FTDI chip via libusb and reads out its EEPROM.
 * The present version has been converted to use our local libraries
 * (libftmini and libuwrap) instead of libftdi - thus the external dependency
 * is only libusb.
 */

#include <sys/types.h>
#include <string.h>
#include <strings.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <usb.h>
#include "../libuwrap/find_dev.h"
#include "../libuwrap/open_close.h"
#include "../libftmini/eeprom_func.h"

char *device_selector;
unsigned eeprom_size = 64;

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

	while ((c = getopt(argc, argv, "bB")) != EOF) {
		switch (c) {
		case 'b':
			eeprom_size = 128;
			continue;
		case 'B':
			eeprom_size = 256;
			continue;
		default:
			/* error msg already printed */
			exit(1);
		}
	}
	if (argc != optind + 1) {
		fprintf(stderr, "usage: %s [options] device-selector\n",
			argv[0]);
		exit(1);
	}
	device_selector = argv[optind];
}

main(argc, argv)
	char **argv;
{
	struct usb_device *dev;
	usb_dev_handle *usbh;
	u_short word;
	unsigned n, col;

	process_cmdline(argc, argv);
	dev = find_usbdev_by_desc_string(device_selector);
	if (!dev) {
		fprintf(stderr, "error: specified USB device not found\n");
		exit(1);
	}
	usbh = usb_open(dev);
	if (!usbh) {
		fprintf(stderr, "error: usb_open() failed\n");
		exit(1);
	}
	for (n = 0; n < eeprom_size; n++) {
		word = ftmini_read_eeprom_loc(usbh, n);
		col = n & 7;
		if (col == 0)
			printf("%02X:", n * 2);
		printf(" %04X", word);
		if (col == 7)
			putchar('\n');
	}
	usb_close(usbh);
	exit(0);
}