From: Uwe Bonnes Date: Mon, 11 Jul 2011 13:03:07 +0000 (+0200) Subject: examples/eeprom: With no VID/PID/desc/serial, print eeprom content X-Git-Tag: v1.0rc1~101 X-Git-Url: http://developer.intra2net.com/git/?p=libftdi;a=commitdiff_plain;h=8ee8775ed78415e8f7274d92493f63f93e2016b0 examples/eeprom: With no VID/PID/desc/serial, print eeprom content of all FTDI devices found with default VID/PID --- diff --git a/examples/eeprom.c b/examples/eeprom.c index 022cf03..e947c00 100644 --- a/examples/eeprom.c +++ b/examples/eeprom.c @@ -11,22 +11,76 @@ #include #include +int read_decode_eeprom(struct ftdi_context *ftdi) +{ + int i, j, f; + int value; + int size; + unsigned char buf[256]; + + f = ftdi_read_eeprom(ftdi); + if (f < 0) + { + fprintf(stderr, "ftdi_read_eeprom: %d (%s)\n", + f, ftdi_get_error_string(ftdi)); + return -1; + } + + + ftdi_get_eeprom_value(ftdi, CHIP_SIZE, & value); + if (value <0) + { + fprintf(stderr, "No EEPROM found\n"); + return -1; + } + fprintf(stderr, "Chip type %d ftdi_eeprom_size: %d\n", ftdi->type, value); + if (ftdi->type == TYPE_R) + size = 0xa0; + else + size = value; + ftdi_get_eeprom_buf(ftdi, buf, size); + for (i=0; i < size; i += 16) + { + fprintf(stdout,"0x%03x:", i); + + for (j = 0; j< 8; j++) + fprintf(stdout," %02x", buf[i+j]); + fprintf(stdout," "); + for (; j< 16; j++) + fprintf(stdout," %02x", buf[i+j]); + fprintf(stdout," "); + for (j = 0; j< 8; j++) + fprintf(stdout,"%c", isprint(buf[i+j])?buf[i+j]:'.'); + fprintf(stdout," "); + for (; j< 16; j++) + fprintf(stdout,"%c", isprint(buf[i+j])?buf[i+j]:'.'); + fprintf(stdout,"\n"); + } + + f = ftdi_eeprom_decode(ftdi, 1); + if (f < 0) + { + fprintf(stderr, "ftdi_eeprom_decode: %d (%s)\n", + f, ftdi_get_error_string(ftdi)); + return -1; + } + return 0; +} + int main(int argc, char **argv) { struct ftdi_context *ftdi; - unsigned char buf[256]; - int f, i, j; - int vid = 0x0403; - int pid = 0x6010; + int f, i; + int vid = 0; + int pid = 0; char const *desc = 0; char const *serial = 0; int erase = 0; int use_defaults = 0; int large_chip = 0; int do_write = 0; - int size; - int value; int retval = 0; + int value; if ((ftdi = ftdi_new()) == 0) { @@ -83,23 +137,60 @@ int main(int argc, char **argv) // Select first interface ftdi_set_interface(ftdi, INTERFACE_ANY); - // Open device - f = ftdi_usb_open_desc(ftdi, vid, pid, desc, serial); - if (f < 0) + if (!vid && !pid && desc == NULL && serial == NULL) { - fprintf(stderr, "Device VID 0x%04x PID 0x%04x", vid, pid); - if (desc) - fprintf(stderr, " Desc %s", desc); - if (serial) - fprintf(stderr, " Serial %s", serial); - fprintf(stderr, "\n"); - fprintf(stderr, "unable to open ftdi device: %d (%s)\n", - f, ftdi_get_error_string(ftdi)); - - retval = -1; - goto done; + struct ftdi_device_list *devlist, *curdev; + int res; + if ((res = ftdi_usb_find_all(ftdi, &devlist, 0, 0)) < 0) + { + fprintf(stderr, "No FTDI with default VID/PID found\n"); + retval = EXIT_FAILURE; + goto do_deinit; + } + if (res > 1) + { + int i = 1; + fprintf(stderr, "%d FTDI devices found: Only Readout on EEPROM done. ",res); + fprintf(stderr, "Use VID/PID/desc/serial to select device\n"); + for (curdev = devlist; curdev != NULL; curdev= curdev->next, i++) + { + f = ftdi_usb_open_dev(ftdi, curdev->dev); + if (f<0) + { + fprintf(stderr, "Unable to open device %d: (%s)", + i, ftdi_get_error_string(ftdi)); + continue; + } + fprintf(stderr, "Decoded values of device %d:\n", i); + read_decode_eeprom(ftdi); + ftdi_usb_close(ftdi); + } + ftdi_list_free(&devlist); + retval = EXIT_SUCCESS; + goto do_deinit; + } + f = ftdi_usb_open_dev(ftdi, devlist[0].dev); + ftdi_list_free(&devlist); + } + else + { + // Open device + f = ftdi_usb_open_desc(ftdi, vid, pid, desc, serial); + if (f < 0) + { + fprintf(stderr, "Device VID 0x%04x PID 0x%04x", vid, pid); + if (desc) + fprintf(stderr, " Desc %s", desc); + if (serial) + fprintf(stderr, " Serial %s", serial); + fprintf(stderr, "\n"); + fprintf(stderr, "unable to open ftdi device: %d (%s)\n", + f, ftdi_get_error_string(ftdi)); + + retval = -1; + goto done; + } } - if (erase) { f = ftdi_erase_eeprom(ftdi); /* needed to determine EEPROM chip type */ @@ -185,58 +276,10 @@ int main(int argc, char **argv) goto done; } } - f = ftdi_read_eeprom(ftdi); - if (f < 0) - { - fprintf(stderr, "ftdi_read_eeprom: %d (%s)\n", - f, ftdi_get_error_string(ftdi)); - retval = -1; - goto done; - } - - - ftdi_get_eeprom_value(ftdi, CHIP_SIZE, & value); - if (value <0) - { - fprintf(stderr, "No EEPROM found\n"); - retval = -1; - goto done; - - } - fprintf(stderr, "Chip type %d ftdi_eeprom_size: %d\n", ftdi->type, value); - if (ftdi->type == TYPE_R) - size = 0xa0; - else - size = value; - ftdi_get_eeprom_buf(ftdi, buf, size); - for (i=0; i < size; i += 16) - { - fprintf(stdout,"0x%03x:", i); - - for (j = 0; j< 8; j++) - fprintf(stdout," %02x", buf[i+j]); - fprintf(stdout," "); - for (; j< 16; j++) - fprintf(stdout," %02x", buf[i+j]); - fprintf(stdout," "); - for (j = 0; j< 8; j++) - fprintf(stdout,"%c", isprint(buf[i+j])?buf[i+j]:'.'); - fprintf(stdout," "); - for (; j< 16; j++) - fprintf(stdout,"%c", isprint(buf[i+j])?buf[i+j]:'.'); - fprintf(stdout,"\n"); - } - - f = ftdi_eeprom_decode(ftdi, 1); - if (f < 0) - { - fprintf(stderr, "ftdi_eeprom_decode: %d (%s)\n", - f, ftdi_get_error_string(ftdi)); - retval = -1; - } - + retval = read_decode_eeprom(ftdi); done: ftdi_usb_close(ftdi); +do_deinit: ftdi_free(ftdi); return retval; }