void Eeprom::init_defaults()
{
- return ftdi_eeprom_initdefaults(&d->eeprom);
+ return ftdi_eeprom_initdefaults(d->context);
}
void Eeprom::set_size(int size)
int Eeprom::build(unsigned char *output)
{
- return ftdi_eeprom_build(&d->eeprom, output);
+ return ftdi_eeprom_build(d->context, output);
}
int Eeprom::read(unsigned char *eeprom)
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)
{
+ struct ftdi_eeprom *eeprom;
+ if (!ftdi)
+ return;
+ if (ftdi->eeprom)
+ return;
+
+ eeprom = ftdi->eeprom;
+
if (eeprom->manufacturer != 0) {
free(eeprom->manufacturer);
eeprom->manufacturer = 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)
+ if (ftdi == NULL)
return -2;
+ if (ftdi->eeprom == NULL)
+ return -2;
+
+ 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)
+ if (ftdi == NULL)
+ return -1;
+ if (ftdi->eeprom == NULL)
return -1;
+
+ eeprom = ftdi->eeprom;
#if 0
size_check = eeprom->size;
size_check -= 28; // 28 are always in use (fixed)
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;
};
/**
+ \brief FTDI eeprom structure
+*/
+struct ftdi_eeprom
+{
+ /** vendor id */
+ int vendor_id;
+ /** product id */
+ int product_id;
+
+ /** self powered */
+ int self_powered;
+ /** remote wakeup */
+ int remote_wakeup;
+ /** chip type */
+ int chip_type;
+
+ /** input in isochronous transfer mode */
+ int in_is_isochronous;
+ /** output in isochronous transfer mode */
+ int out_is_isochronous;
+ /** suspend pull downs */
+ int suspend_pull_downs;
+
+ /** use serial */
+ int use_serial;
+ /** fake usb version */
+ int change_usb_version;
+ /** usb version */
+ int usb_version;
+ /** maximum power */
+ int max_power;
+
+ /** manufacturer name */
+ char *manufacturer;
+ /** product name */
+ char *product;
+ /** serial number */
+ char *serial;
+
+ /* Special function of FT232R devices (and possibly others as well) */
+ /** CBUS pin function. See CBUS_xxx defines. */
+ int cbus_function[5];
+ /** Select hight current drive. */
+ int high_current;
+ /** Select inversion of data lines (bitmask). */
+ int invert;
+
+ /** eeprom size in bytes. This doesn't get stored in the eeprom
+ but is the only way to pass it to ftdi_eeprom_build. */
+ int size;
+};
+
+/**
\brief Main context structure for all libftdi functions.
Do not access directly if possible.
/** Bitbang mode. 1: (default) Normal bitbang mode, 2: FT2232C SPI bitbang mode */
unsigned char bitbang_mode;
- /** EEPROM size. Default is 128 bytes for 232BM and 245BM chips */
- int eeprom_size;
+ /** Decoded eeprom structure */
+ struct ftdi_eeprom *eeprom;
/** String representation of last error */
char *error_str;
#define HIGH_CURRENT_DRIVE 0x04
/**
- \brief FTDI eeprom structure
-*/
-struct ftdi_eeprom
-{
- /** vendor id */
- int vendor_id;
- /** product id */
- int product_id;
-
- /** self powered */
- int self_powered;
- /** remote wakeup */
- int remote_wakeup;
- /** chip type */
- int chip_type;
-
- /** input in isochronous transfer mode */
- int in_is_isochronous;
- /** output in isochronous transfer mode */
- int out_is_isochronous;
- /** suspend pull downs */
- int suspend_pull_downs;
-
- /** use serial */
- int use_serial;
- /** fake usb version */
- int change_usb_version;
- /** usb version */
- int usb_version;
- /** maximum power */
- int max_power;
-
- /** manufacturer name */
- char *manufacturer;
- /** product name */
- char *product;
- /** serial number */
- char *serial;
-
- /* Special function of FT232R devices (and possibly others as well) */
- /** CBUS pin function. See CBUS_xxx defines. */
- int cbus_function[5];
- /** Select hight current drive. */
- int high_current;
- /** Select inversion of data lines (bitmask). */
- int invert;
-
- /** eeprom size in bytes. This doesn't get stored in the eeprom
- but is the only way to pass it to ftdi_eeprom_build. */
- int size;
-};
-
-/**
\brief Progress Info for streaming read
*/
struct size_and_time
void ftdi_eeprom_setsize(struct ftdi_context *ftdi, struct ftdi_eeprom *eeprom, int size);
/* init and build eeprom from ftdi_eeprom structure */
- void ftdi_eeprom_initdefaults(struct ftdi_eeprom *eeprom);
- void ftdi_eeprom_free(struct ftdi_eeprom *eeprom);
- int ftdi_eeprom_build(struct ftdi_eeprom *eeprom, unsigned char *output);
- int ftdi_eeprom_decode(struct ftdi_eeprom *eeprom, unsigned char *output, int size);
+ void ftdi_eeprom_initdefaults(struct ftdi_context *ftdi);
+ void ftdi_eeprom_free(struct ftdi_context *ftdi);
+ int ftdi_eeprom_build(struct ftdi_context *ftdi, unsigned char *output);
+ int ftdi_eeprom_decode(struct ftdi_context *ftdi, unsigned char *output, int size);
/* "eeprom" needs to be valid 128 byte eeprom (generated by the eeprom generator)
the checksum of the eeprom is valided */