int main(int argc, char **argv)
{
- struct ftdi_context ftdic;
- struct ftdi_eeprom eeprom;
- unsigned char buf[2048];
- int size;
+ struct ftdi_context *ftdi;
+ unsigned char *buf;
int f, i, j;
int vid = 0x0403;
int pid = 0x6010;
int erase = 0;
int use_defaults = 0;
int large_chip = 0;
+ int do_write = 0;
+ int size;
- while ((i = getopt(argc, argv, "d::ev:p:P:S:")) != -1)
+ 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 '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 <number> Search for device with PID == number\n");
}
}
- // Init
- if (ftdi_init(&ftdic) < 0)
- {
- fprintf(stderr, "ftdi_init failed\n");
- return EXIT_FAILURE;
- }
-
// Select first interface
- ftdi_set_interface(&ftdic, INTERFACE_ANY);
+ ftdi_set_interface(ftdi, INTERFACE_ANY);
// Open device
- f = ftdi_usb_open_desc(&ftdic, vid, pid, desc, serial);
+ f = ftdi_usb_open_desc(ftdi, vid, pid, desc, serial);
if (f < 0)
{
fprintf(stderr, "Device VID 0x%04x PID 0x%04x", vid, pid);
fprintf(stderr, " Serial %s", serial);
fprintf(stderr, "\n");
fprintf(stderr, "unable to open ftdi device: %d (%s)\n",
- f, ftdi_get_error_string(&ftdic));
+ f, ftdi_get_error_string(ftdi));
exit(-1);
}
if (erase)
{
- ftdi_eeprom_setsize(&ftdic, &eeprom, 2048);
- f = ftdi_erase_eeprom(&ftdic);
+ f = ftdi_erase_eeprom(ftdi);
if (f < 0)
{
fprintf(stderr, "Erase failed: %s",
- ftdi_get_error_string(&ftdic));
+ ftdi_get_error_string(ftdi));
return -2;
}
- if (ftdic.eeprom->chip == -1)
+ if (ftdi->eeprom->chip == -1)
fprintf(stderr, "No EEPROM\n");
- else if (ftdic.eeprom->chip == 0)
+ else if (ftdi->eeprom->chip == 0)
fprintf(stderr, "Internal EEPROM\n");
else
- fprintf(stderr, "Found 93x%02x\n",ftdic.eeprom->chip);
+ fprintf(stderr, "Found 93x%02x\n",ftdi->eeprom->chip);
return 0;
}
- size = 2048;
- memset(buf,0, size);
- ftdic.eeprom = &eeprom;
if(use_defaults)
{
- ftdi_eeprom_initdefaults(&ftdic);
- ftdic.eeprom->manufacturer="IKDA";
- ftdic.eeprom->product="CPS-CONN";
- ftdic.eeprom->serial="0001";
- ftdic.eeprom->chip= large_chip;
- ftdic.eeprom->cbus_function[0]= CBUS_BB_RD;
- ftdic.eeprom->cbus_function[1]= CBUS_CLK48;
- ftdic.eeprom->cbus_function[2]= CBUS_IOMODE;
- ftdic.eeprom->cbus_function[3]= CBUS_BB;
- ftdic.eeprom->cbus_function[4]= CBUS_CLK6;
- f=(ftdi_eeprom_build(&ftdic, buf));
+ ftdi_eeprom_initdefaults(ftdi, "IKDA", "FTDIJTAF", "0001");
+ ftdi->eeprom->max_power = 500;
+ f=(ftdi_eeprom_build(ftdi));
if (f < 0)
{
fprintf(stderr, "ftdi_eeprom_build: %d (%s)\n",
- f, ftdi_get_error_string(&ftdic));
+ f, ftdi_get_error_string(ftdi));
exit(-1);
}
}
+ else if(do_write)
+ {
+ ftdi_eeprom_initdefaults(ftdi, "IKDA", "FTDIJTAG", "0001");
+ ftdi->eeprom->max_power = 500;
+ f = ftdi_erase_eeprom(ftdi);
+ if (ftdi->eeprom->chip == -1)
+ fprintf(stderr, "No EEPROM\n");
+ else if (ftdi->eeprom->chip == 0)
+ fprintf(stderr, "Internal EEPROM\n");
+ else
+ fprintf(stderr, "Found 93x%02x\n",ftdi->eeprom->chip);
+ f=(ftdi_eeprom_build(ftdi));
+ if (f < 0)
+ {
+ fprintf(stderr, "Erase failed: %s",
+ ftdi_get_error_string(ftdi));
+ return -2;
+ }
+ f = ftdi_write_eeprom(ftdi);
+ {
+ fprintf(stderr, "ftdi_eeprom_decode: %d (%s)\n",
+ f, ftdi_get_error_string(ftdi));
+ exit(-1);
+ }
+ f = ftdi_read_eeprom(ftdi);
+ if (f < 0)
+ {
+ fprintf(stderr, "ftdi_read_eeprom: %d (%s)\n",
+ f, ftdi_get_error_string(ftdi));
+ exit(-1);
+ }
+ }
else
{
- f = ftdi_read_eeprom(&ftdic, buf);
+ f = ftdi_read_eeprom(ftdi);
if (f < 0)
{
fprintf(stderr, "ftdi_read_eeprom: %d (%s)\n",
- f, ftdi_get_error_string(&ftdic));
+ f, ftdi_get_error_string(ftdi));
exit(-1);
}
}
- fprintf(stderr, "Chip type %d ftdi_eeprom_size: %d\n", ftdic.type, ftdic.eeprom->size);
- for(i=0; i < ftdic.eeprom->size; i += 16)
+
+
+ fprintf(stderr, "Chip type %d ftdi_eeprom_size: %d\n", ftdi->type, ftdi->eeprom->size);
+ buf = ftdi->eeprom->buf;
+ if (ftdi->type == TYPE_R)
+ size = 0xa0;
+ else
+ size = ftdi->eeprom->size;
+ for(i=0; i < size; i += 16)
{
fprintf(stdout,"0x%03x:", i);
fprintf(stdout,"\n");
}
- f = ftdi_eeprom_decode(&ftdic,buf, size, 1);
+ f = ftdi_eeprom_decode(ftdi, 1);
+ if (f < 0)
{
fprintf(stderr, "ftdi_eeprom_decode: %d (%s)\n",
- f, ftdi_get_error_string(&ftdic));
+ f, ftdi_get_error_string(ftdi));
exit(-1);
}
-
- ftdi_usb_close(&ftdic);
- ftdi_deinit(&ftdic);
+ ftdi_usb_close(ftdi);
+ ftdi_free(ftdi);
+ return 0;
}