Let the eeprom functions work on the ftdi_context, not the ftdi_eeprom structure
authorUwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de>
Wed, 8 Sep 2010 10:00:31 +0000 (12:00 +0200)
committerThomas Jarosch <thomas.jarosch@intra2net.com>
Mon, 20 Sep 2010 13:34:35 +0000 (15:34 +0200)
ftdipp/ftdi.cpp
src/ftdi.c
src/ftdi.h

index c81eb5f..82c1fca 100644 (file)
@@ -395,7 +395,7 @@ Eeprom::~Eeprom()
 
 void Eeprom::init_defaults()
 {
-    return ftdi_eeprom_initdefaults(&d->eeprom);
+    return ftdi_eeprom_initdefaults(d->context);
 }
 
 void Eeprom::set_size(int size)
@@ -415,7 +415,7 @@ int Eeprom::chip_id(unsigned int *chipid)
 
 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)
index 30b5b55..139bbd9 100644 (file)
@@ -101,7 +101,7 @@ int ftdi_init(struct ftdi_context *ftdi)
 
     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);
@@ -2165,8 +2165,8 @@ void ftdi_eeprom_setsize(struct ftdi_context *ftdi, struct ftdi_eeprom *eeprom,
     if (ftdi == NULL)
         return;
 
-    ftdi->eeprom_size=size;
-    eeprom->size=size;
+    ftdi->eeprom = eeprom;
+    ftdi->eeprom->size=size;
 }
 
 /**
@@ -2174,13 +2174,19 @@ void ftdi_eeprom_setsize(struct ftdi_context *ftdi, struct ftdi_eeprom *eeprom,
 
     \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;
 
@@ -2215,8 +2221,16 @@ void ftdi_eeprom_initdefaults(struct ftdi_eeprom *eeprom)
 
     \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;
@@ -2246,16 +2260,21 @@ void ftdi_eeprom_free(struct ftdi_eeprom *eeprom)
     \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);
@@ -2470,15 +2489,20 @@ int ftdi_eeprom_build(struct ftdi_eeprom *eeprom, unsigned char *output)
    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)
@@ -2682,7 +2706,7 @@ int ftdi_read_eeprom(struct ftdi_context *ftdi, unsigned char *eeprom)
     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");
@@ -2829,7 +2853,7 @@ int ftdi_write_eeprom(struct ftdi_context *ftdi, unsigned char *eeprom)
     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;
index 86e4c62..07300b6 100644 (file)
@@ -168,6 +168,59 @@ struct ftdi_transfer_control
 };
 
 /**
+    \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.
@@ -217,8 +270,8 @@ struct ftdi_context
     /** 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;
@@ -284,59 +337,6 @@ struct ftdi_device_list
 #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
@@ -441,10 +441,10 @@ extern "C"
     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 */