From 68e78641352b9ae737f15bd55d93b11739fd333b Mon Sep 17 00:00:00 2001 From: Jarkko Sonninen Date: Sun, 24 Mar 2013 10:14:18 +0200 Subject: [PATCH] Save device release number. Allow writing of eeprom buffer, that was read from device. --- src/ftdi.c | 70 ++++++++++++++++++++++++++++++++------------------------- src/ftdi.h | 1 + src/ftdi_i.h | 3 ++ 3 files changed, 43 insertions(+), 31 deletions(-) diff --git a/src/ftdi.c b/src/ftdi.c index 5570bd4..6d4a64b 100644 --- a/src/ftdi.c +++ b/src/ftdi.c @@ -2392,7 +2392,32 @@ int ftdi_eeprom_initdefaults(struct ftdi_context *ftdi, char * manufacturer, } eeprom->size = -1; } - eeprom->initialized_for_connected_device = 1; + switch (ftdi->type) + { + case TYPE_AM: + eeprom->release_number = 0x0200; + break; + case TYPE_BM: + eeprom->release_number = 0x0400; + break; + case TYPE_2232C: + eeprom->release_number = 0x0500; + break; + case TYPE_R: + eeprom->release_number = 0x0600; + break; + case TYPE_2232H: + eeprom->release_number = 0x0700; + break; + case TYPE_4232H: + eeprom->release_number = 0x0800; + break; + case TYPE_232H: + eeprom->release_number = 0x0900; + break; + default: + eeprom->release_number = 0x00; + } return 0; } /*FTD2XX doesn't check for values not fitting in the ACBUS Signal oprtions*/ @@ -2539,33 +2564,8 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi) output[0x05] = eeprom->product_id >> 8; // Addr 06: Device release number (0400h for BM features) - output[0x06] = 0x00; - switch (ftdi->type) - { - case TYPE_AM: - output[0x07] = 0x02; - break; - case TYPE_BM: - output[0x07] = 0x04; - break; - case TYPE_2232C: - output[0x07] = 0x05; - break; - case TYPE_R: - output[0x07] = 0x06; - break; - case TYPE_2232H: - output[0x07] = 0x07; - break; - case TYPE_4232H: - output[0x07] = 0x08; - break; - case TYPE_232H: - output[0x07] = 0x09; - break; - default: - output[0x07] = 0x00; - } + output[0x06] = eeprom->release_number; + output[0x07] = eeprom->release_number >> 8; // Addr 08: Config descriptor // Bit 7: always 1 @@ -2983,6 +2983,7 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi) output[eeprom->size-2] = checksum; output[eeprom->size-1] = checksum >> 8; + eeprom->initialized_for_connected_device = 1; return user_area_size; } /* Decode the encoded EEPROM field for the FTDI Mode into a value for the abstracted @@ -3025,7 +3026,6 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose) int eeprom_size; struct ftdi_eeprom *eeprom; unsigned char *buf = ftdi->eeprom->buf; - int release; if (ftdi == NULL) ftdi_error_return(-1,"No context"); @@ -3041,7 +3041,8 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose) // Addr 04: Product ID eeprom->product_id = buf[0x04] + (buf[0x05] << 8); - release = buf[0x06] + (buf[0x07]<<8); + // Addr 06: Device release number + eeprom->release_number = buf[0x06] + (buf[0x07]<<8); // Addr 08: Config descriptor // Bit 7: always 1 @@ -3262,7 +3263,7 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose) char *channel_mode[] = {"UART", "FIFO", "CPU", "OPTO", "FT1284"}; fprintf(stdout, "VID: 0x%04x\n",eeprom->vendor_id); fprintf(stdout, "PID: 0x%04x\n",eeprom->product_id); - fprintf(stdout, "Release: 0x%04x\n",release); + fprintf(stdout, "Release: 0x%04x\n",eeprom->release_number); if (eeprom->self_powered) fprintf(stdout, "Self-Powered%s", (eeprom->remote_wakeup)?", USB Remote Wake Up\n":"\n"); @@ -3417,6 +3418,9 @@ int ftdi_get_eeprom_value(struct ftdi_context *ftdi, enum ftdi_eeprom_value valu case PRODUCT_ID: *value = ftdi->eeprom->product_id; break; + case RELEASE_NUMBER: + *value = ftdi->eeprom->release_number; + break; case SELF_POWERED: *value = ftdi->eeprom->self_powered; break; @@ -3604,6 +3608,9 @@ int ftdi_set_eeprom_value(struct ftdi_context *ftdi, enum ftdi_eeprom_value valu case PRODUCT_ID: ftdi->eeprom->product_id = value; break; + case RELEASE_NUMBER: + ftdi->eeprom->release_number = value; + break; case SELF_POWERED: ftdi->eeprom->self_powered = value; break; @@ -3765,6 +3772,7 @@ int ftdi_set_eeprom_value(struct ftdi_context *ftdi, enum ftdi_eeprom_value valu default : ftdi_error_return(-1, "Request to unknown EEPROM value"); } + eeprom->initialized_for_connected_device = 0; return 0; } diff --git a/src/ftdi.h b/src/ftdi.h index 141a795..c1d74f1 100644 --- a/src/ftdi.h +++ b/src/ftdi.h @@ -309,6 +309,7 @@ enum ftdi_eeprom_value CHANNEL_B_RS485 = 52, CHANNEL_C_RS485 = 53, CHANNEL_D_RS485 = 54, + RELEASE_NUMBER = 55, }; /** diff --git a/src/ftdi_i.h b/src/ftdi_i.h index 1d52df1..b973680 100644 --- a/src/ftdi_i.h +++ b/src/ftdi_i.h @@ -129,5 +129,8 @@ struct ftdi_eeprom /* EEPROM Type 0x46 for 93xx46, 0x56 for 93xx56 and 0x66 for 93xx66*/ int chip; unsigned char buf[FTDI_MAX_EEPROM_SIZE]; + + /** device release number */ + int release_number; }; -- 1.7.1