X-Git-Url: http://developer.intra2net.com/git/?p=libftdi;a=blobdiff_plain;f=src%2Fftdi.c;h=3daea7498700734eacb2af846034c6c71670ddac;hp=63e2a36782701e6a2b5c7611ec43733bee86961f;hb=f14f84d3ab33c785903e5b4fb615076f9cbcefad;hpb=a35aa9bdfbb149efe72c32727a0ebfe3585465f8 diff --git a/src/ftdi.c b/src/ftdi.c index 63e2a36..3daea74 100644 --- a/src/ftdi.c +++ b/src/ftdi.c @@ -199,6 +199,21 @@ void ftdi_deinit(struct ftdi_context *ftdi) if (ftdi->eeprom != NULL) { + if (ftdi->eeprom->manufacturer != 0) + { + free(ftdi->eeprom->manufacturer); + ftdi->eeprom->manufacturer = 0; + } + if (ftdi->eeprom->product != 0) + { + free(ftdi->eeprom->product); + ftdi->eeprom->product = 0; + } + if (ftdi->eeprom->serial != 0) + { + free(ftdi->eeprom->serial); + ftdi->eeprom->serial = 0; + } free(ftdi->eeprom); ftdi->eeprom = NULL; } @@ -2165,17 +2180,25 @@ int ftdi_set_error_char(struct ftdi_context *ftdi, /** Init eeprom with default values. \param ftdi pointer to ftdi_context - + \param manufacturer String to use as Manufacturer + \param product String to use as Product description + \param serial String to use as Serial number description + + \retval 0: all fine + \retval -1: No struct ftdi_context + \retval -2: No struct ftdi_eeprom */ -void ftdi_eeprom_initdefaults(struct ftdi_context *ftdi) +int ftdi_eeprom_initdefaults(struct ftdi_context *ftdi, char * manufacturer, + char * product, char * serial) { struct ftdi_eeprom *eeprom; if (ftdi == NULL) - return; + ftdi_error_return(-1, "No struct ftdi_context"); + if (ftdi->eeprom == NULL) - return; + ftdi_error_return(-2,"No struct ftdi_eeprom"); eeprom = ftdi->eeprom; memset(eeprom, 0, sizeof(struct ftdi_eeprom)); @@ -2193,9 +2216,35 @@ void ftdi_eeprom_initdefaults(struct ftdi_context *ftdi) eeprom->usb_version = 0x0200; eeprom->max_power = 50; + if (eeprom->manufacturer) + free (eeprom->manufacturer); eeprom->manufacturer = NULL; + if (manufacturer) + { + eeprom->manufacturer = malloc(strlen(manufacturer)+1); + if (eeprom->manufacturer) + strcpy(eeprom->manufacturer, manufacturer); + } + + if (eeprom->product) + free (eeprom->product); eeprom->product = NULL; + { + eeprom->product = malloc(strlen(product)+1); + if (eeprom->product) + strcpy(eeprom->product, product); + } + + if (eeprom->serial) + free (eeprom->serial); eeprom->serial = NULL; + if (serial) + { + eeprom->serial = malloc(strlen(serial)+1); + if (eeprom->serial) + strcpy(eeprom->serial, serial); + } + if(ftdi->type == TYPE_R) { @@ -2209,34 +2258,7 @@ void ftdi_eeprom_initdefaults(struct ftdi_context *ftdi) } else eeprom->size = -1; -} - -/** - Frees allocated memory in eeprom. - - \param ftdi pointer to ftdi_context -*/ -void ftdi_eeprom_free(struct ftdi_context *ftdi) -{ - 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; - } - } + return 0; } /** @@ -2698,6 +2720,8 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose) // Addr 0E: Offset of the manufacturer string + 0x80, calculated later // Addr 0F: Length of manufacturer string manufacturer_size = buf[0x0F]/2; + if(eeprom->manufacturer) + free(eeprom->manufacturer); if (manufacturer_size > 0) { eeprom->manufacturer = malloc(manufacturer_size); @@ -2716,6 +2740,8 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose) // Addr 10: Offset of the product string + 0x80, calculated later // Addr 11: Length of product string + if(eeprom->product) + free(eeprom->product); product_size = buf[0x11]/2; if (product_size > 0) { @@ -2735,6 +2761,8 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose) // Addr 12: Offset of the serial string + 0x80, calculated later // Addr 13: Length of serial string + if(eeprom->serial) + free(eeprom->serial); serial_size = buf[0x13]/2; if (serial_size > 0) {