From: Uwe Bonnes Date: Wed, 8 Sep 2010 10:00:31 +0000 (+0200) Subject: Let the eeprom functions work on the ftdi_context, not the ftdi_eeprom structure X-Git-Tag: v1.0rc1~133^2~130 X-Git-Url: http://developer.intra2net.com/git/?p=libftdi;a=commitdiff_plain;h=c0a96aed965e1010f131aaac4d7025ebf00c35dd Let the eeprom functions work on the ftdi_context, not the ftdi_eeprom structure --- diff --git a/ftdipp/ftdi.cpp b/ftdipp/ftdi.cpp index c81eb5f..82c1fca 100644 --- a/ftdipp/ftdi.cpp +++ b/ftdipp/ftdi.cpp @@ -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) diff --git a/src/ftdi.c b/src/ftdi.c index 30b5b55..139bbd9 100644 --- a/src/ftdi.c +++ b/src/ftdi.c @@ -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; diff --git a/src/ftdi.h b/src/ftdi.h index 86e4c62..07300b6 100644 --- a/src/ftdi.h +++ b/src/ftdi.h @@ -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 */