ftdi->error_str = NULL;
- ftdi->eeprom_size = FTDI_DEFAULT_EEPROM_SIZE;
+ ftdi->eeprom = NULL;
/* All fine. Now allocate the readbuffer */
return ftdi_read_data_set_chunksize(ftdi, 4096);
if (ftdi == NULL)
return;
- ftdi->eeprom_size=size;
- eeprom->size=size;
+ ftdi->eeprom = eeprom;
+ ftdi->eeprom->size=size;
}
/**
\param eeprom Pointer to ftdi_eeprom
*/
-void ftdi_eeprom_initdefaults(struct ftdi_eeprom *eeprom)
+void ftdi_eeprom_initdefaults(struct ftdi_context *ftdi)
{
int i;
+ struct ftdi_eeprom *eeprom;
- if (eeprom == NULL)
+ if (ftdi == NULL)
+ return;
+
+ if (ftdi->eeprom == NULL)
return;
+ eeprom = ftdi->eeprom;
+
eeprom->vendor_id = 0x0403;
eeprom->product_id = 0x6001;
\param eeprom Pointer to ftdi_eeprom
*/
-void ftdi_eeprom_free(struct ftdi_eeprom *eeprom)
+void ftdi_eeprom_free(struct ftdi_context *ftdi)
{
- if (eeprom->manufacturer != 0) {
- free(eeprom->manufacturer);
- eeprom->manufacturer = 0;
- }
- if (eeprom->product != 0) {
- free(eeprom->product);
- eeprom->product = 0;
- }
- if (eeprom->serial != 0) {
- free(eeprom->serial);
- eeprom->serial = 0;
+ if (!ftdi)
+ return;
+ if (ftdi->eeprom)
+ {
+ struct ftdi_eeprom *eeprom = ftdi->eeprom;
+
+ if (eeprom->manufacturer != 0) {
+ free(eeprom->manufacturer);
+ eeprom->manufacturer = 0;
+ }
+ if (eeprom->product != 0) {
+ free(eeprom->product);
+ eeprom->product = 0;
+ }
+ if (eeprom->serial != 0) {
+ free(eeprom->serial);
+ eeprom->serial = 0;
+ }
}
}
\retval -4: Chip doesn't support invert
\retval -5: Chip doesn't support high current drive
*/
-int ftdi_eeprom_build(struct ftdi_eeprom *eeprom, unsigned char *output)
+int ftdi_eeprom_build(struct ftdi_context *ftdi, unsigned char *output)
{
unsigned char i, j;
unsigned short checksum, value;
unsigned char manufacturer_size = 0, product_size = 0, serial_size = 0;
int size_check;
const int cbus_max[5] = {13, 13, 13, 13, 9};
+ struct ftdi_eeprom *eeprom;
- if (eeprom == NULL)
- return -2;
+ if (ftdi == NULL)
+ ftdi_error_return(-2,"No context");
+ if (ftdi->eeprom == NULL)
+ ftdi_error_return(-2,"No eeprom structure");
+
+ eeprom= ftdi->eeprom;
if (eeprom->manufacturer != NULL)
manufacturer_size = strlen(eeprom->manufacturer);
FIXME: How to pass size? How to handle size field in ftdi_eeprom?
FIXME: Strings are malloc'ed here and should be freed somewhere
*/
-int ftdi_eeprom_decode(struct ftdi_eeprom *eeprom, unsigned char *buf, int size)
+int ftdi_eeprom_decode(struct ftdi_context *ftdi, unsigned char *buf, int size)
{
unsigned char i, j;
unsigned short checksum, eeprom_checksum, value;
unsigned char manufacturer_size = 0, product_size = 0, serial_size = 0;
int eeprom_size = 128;
+ struct ftdi_eeprom *eeprom;
- if (eeprom == NULL)
- return -1;
+ if (ftdi == NULL)
+ ftdi_error_return(-1,"No context");
+ if (ftdi->eeprom == NULL)
+ ftdi_error_return(-1,"No eeprom");
+
+ eeprom = ftdi->eeprom;
#if 0
size_check = eeprom->size;
size_check -= 28; // 28 are always in use (fixed)
// eeprom size exceeded?
if (size_check < 0)
- return (-1);
+ ftdi_error_return(-1,"Size check failed");
#endif
// empty eeprom struct
if (eeprom_checksum != checksum)
{
fprintf(stderr, "Checksum Error: %04x %04x\n", checksum, eeprom_checksum);
- return -1;
+ ftdi_error_return(-1,"EEPROM checksum error");
}
return 0;
if (ftdi == NULL || ftdi->usb_dev == NULL)
ftdi_error_return(-2, "USB device unavailable");
- for (i = 0; i < ftdi->eeprom_size/2; i++)
+ for (i = 0; i < ftdi->eeprom->size/2; i++)
{
if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_READ_EEPROM_REQUEST, 0, i, eeprom+(i*2), 2, ftdi->usb_read_timeout) != 2)
ftdi_error_return(-1, "reading eeprom failed");
if ((ret = ftdi_set_latency_timer(ftdi, 0x77)) != 0)
return ret;
- for (i = 0; i < ftdi->eeprom_size/2; i++)
+ for (i = 0; i < ftdi->eeprom->size/2; i++)
{
usb_val = eeprom[i*2];
usb_val += eeprom[(i*2)+1] << 8;