/* LIBFTDI EEPROM access example This program is distributed under the GPL, version 2 */ #include #include #include #include #include #include #include int main(int argc, char **argv) { struct ftdi_context *ftdi; unsigned char buf[256]; int f, i, j; int vid = 0x0403; int pid = 0x6010; 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; if ((ftdi = ftdi_new()) == 0) { fprintf(stderr, "Failed to allocate ftdi structure :%s \n", ftdi_get_error_string(ftdi)); return EXIT_FAILURE; } while ((i = getopt(argc, argv, "d::ev:p:l:P:S:w")) != -1) { switch (i) { case 'd': use_defaults = 1; if (optarg) large_chip = 0x66; break; case 'e': erase = 1; break; case 'v': vid = strtoul(optarg, NULL, 0); break; case 'p': pid = strtoul(optarg, NULL, 0); break; case 'P': desc = optarg; break; case 'S': serial = optarg; break; case 'w': do_write = 1; break; default: fprintf(stderr, "usage: %s [options]\n", *argv); fprintf(stderr, "\t-d[num] Work with default valuesfor 128 Byte " "EEPROM or for 256 Byte EEPROM if some [num] is given\n"); fprintf(stderr, "\t-w write\n"); fprintf(stderr, "\t-e erase\n"); fprintf(stderr, "\t-v verbose decoding\n"); fprintf(stderr, "\t-p Search for device with PID == number\n"); fprintf(stderr, "\t-v Search for device with VID == number\n"); fprintf(stderr, "\t-P 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)); exit(-1); } ftdi_usb_close(ftdi); ftdi_free(ftdi); return 0; }