Hello,
to ease API/ABI stablity with future extensions, appended patch provides
ftdi_get|set_eeprom_value and ftdi_get_eeprom_buf to get a copy of the
ftdi->eeprom->buf content.
Is this the way to go with access to struct ftdi members too?
Bye
--
Uwe Bonnes bon@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Institut fuer Kernphysik Schlossgartenstrasse 9 64289 Darmstadt
--------- Tel. 06151 162516 -------- Fax. 06151 164321 ----------
>From d13a6dddbe9e2ddf3886770c91c9e8c2c0351775 Mon Sep 17 00:00:00 2001
From: Uwe Bonnes <bon@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx>
Date: Sat, 2 Oct 2010 17:24:00 +0200
Subject: Enumerate all handled EEPROM values
Provide ftdi_get|set_eeprom_value to access these properities
Supply a coy of the EEPROM Buffer to the used with ftdi_get_eepron_buf
e.g. for dumping
---
src/ftdi.c | 286 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/ftdi.h | 52 +++++++++++
2 files changed, 338 insertions(+), 0 deletions(-)
diff --git a/src/ftdi.c b/src/ftdi.c
index 8deabd0..e33572b 100644
--- a/src/ftdi.c
+++ b/src/ftdi.c
@@ -2968,6 +2968,292 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int
verbose)
}
/**
+ Get a value from the decoded EEPROM Structure
+
+ \\param ftdi pointer to ftdi_context
+ \\param value_name Enum of the value to query
+ \\param Pointer to store read value
+
+ \\retval 0: all fine
+ \\retval -1: Value doesn't exist
+*/
+int ftdi_get_eeprom_value(struct ftdi_context *ftdi, enum ftdi_eeprom_value
value_name, int* value)
+{
+ switch (value_name)
+ {
+ case VENDOR_ID :
+ *value = ftdi->eeprom->vendor_id;
+ break;
+ case PRODUCT_ID :
+ *value = ftdi->eeprom->product_id;
+ break;
+ case SELF_POWERED:
+ *value = ftdi->eeprom->self_powered;
+ break;
+ case REMOTE_WAKEUP:
+ *value = ftdi->eeprom->remote_wakeup;
+ break;
+ case IS_NOT_PNP:
+ *value = ftdi->eeprom->is_not_pnp;
+ break;
+ case SUSPEND_DBUS7:
+ *value = ftdi->eeprom->suspend_dbus7;
+ break;
+ case IN_IS_ISOCHRONOUS:
+ *value = ftdi->eeprom->in_is_isochronous;
+ break;
+ case SUSPEND_PULL_DOWNS:
+ *value = ftdi->eeprom->suspend_pull_downs;
+ break;
+ case USE_SERIAL:
+ *value = ftdi->eeprom->use_serial;
+ break;
+ case USB_VERSION:
+ *value = ftdi->eeprom->usb_version;
+ break;
+ case MAX_POWER:
+ *value = ftdi->eeprom->max_power;
+ break;
+ case CHANNEL_A_TYPE:
+ *value = ftdi->eeprom->channel_a_type;
+ break;
+ case CHANNEL_B_TYPE:
+ *value = ftdi->eeprom->channel_b_type;
+ break;
+ case CHANNEL_A_DRIVER:
+ *value = ftdi->eeprom->channel_a_driver;
+ break;
+ case CHANNEL_B_DRIVER:
+ *value = ftdi->eeprom->channel_b_driver;
+ break;
+ case CBUS_FUNCTION_0:
+ *value = ftdi->eeprom->cbus_function[0];
+ break;
+ case CBUS_FUNCTION_1:
+ *value = ftdi->eeprom->cbus_function[1];
+ break;
+ case CBUS_FUNCTION_2:
+ *value = ftdi->eeprom->cbus_function[2];
+ break;
+ case CBUS_FUNCTION_3:
+ *value = ftdi->eeprom->cbus_function[3];
+ break;
+ case CBUS_FUNCTION_4:
+ *value = ftdi->eeprom->cbus_function[4];
+ break;
+ case HIGH_CURRENT:
+ *value = ftdi->eeprom->high_current;
+ break;
+ case HIGH_CURRENT_A:
+ *value = ftdi->eeprom->high_current_a;
+ break;
+ case HIGH_CURRENT_B:
+ *value = ftdi->eeprom->high_current_b;
+ break;
+ case INVERT:
+ *value = ftdi->eeprom->invert;
+ break;
+ case GROUP0_DRIVE:
+ *value = ftdi->eeprom->group0_drive;
+ break;
+ case GROUP0_SCHMITT:
+ *value = ftdi->eeprom->group0_schmitt;
+ break;
+ case GROUP0_SLEW:
+ *value = ftdi->eeprom->group0_slew;
+ break;
+ case GROUP1_DRIVE:
+ *value = ftdi->eeprom->group1_drive;
+ break;
+ case GROUP1_SCHMITT:
+ *value = ftdi->eeprom->group1_schmitt;
+ break;
+ case GROUP1_SLEW:
+ *value = ftdi->eeprom->group1_slew;
+ break;
+ case GROUP2_DRIVE:
+ *value = ftdi->eeprom->group2_drive;
+ break;
+ case GROUP2_SCHMITT:
+ *value = ftdi->eeprom->group2_schmitt;
+ break;
+ case GROUP2_SLEW:
+ *value = ftdi->eeprom->group2_slew;
+ break;
+ case GROUP3_DRIVE:
+ *value = ftdi->eeprom->group3_drive;
+ break;
+ case GROUP3_SCHMITT:
+ *value = ftdi->eeprom->group3_schmitt;
+ break;
+ case GROUP3_SLEW:
+ *value = ftdi->eeprom->group3_slew;
+ break;
+ case CHIP_TYPE:
+ *value = ftdi->eeprom->chip;
+ break;
+ case CHIP_SIZE:
+ *value = ftdi->eeprom->size;
+ break;
+ default :
+ ftdi_error_return(-1, "Request for unknown EEPROM value");
+ }
+ return 0;
+}
+
+/**
+ Set a value in the decoded EEPROM Structure
+ No parameter checking is performed
+
+ \\param ftdi pointer to ftdi_context
+ \\param value_name Enum of the value to query
+ \\param Value to set
+
+ \\retval 0: all fine
+ \\retval -1: Value doesn't exist
+ \\retval -2: Value not user settable
+*/
+int ftdi_set_eeprom_value(struct ftdi_context *ftdi, enum ftdi_eeprom_value
value_name, int value)
+{
+ switch (value_name)
+ {
+ case VENDOR_ID :
+ ftdi->eeprom->vendor_id = value;
+ break;
+ case PRODUCT_ID :
+ ftdi->eeprom->product_id = value;
+ break;
+ case SELF_POWERED:
+ ftdi->eeprom->self_powered = value;
+ break;
+ case REMOTE_WAKEUP:
+ ftdi->eeprom->remote_wakeup = value;
+ break;
+ case IS_NOT_PNP:
+ ftdi->eeprom->is_not_pnp = value;
+ break;
+ case SUSPEND_DBUS7:
+ ftdi->eeprom->suspend_dbus7 = value;
+ break;
+ case IN_IS_ISOCHRONOUS:
+ ftdi->eeprom->in_is_isochronous = value;
+ break;
+ case SUSPEND_PULL_DOWNS:
+ ftdi->eeprom->suspend_pull_downs = value;
+ break;
+ case USE_SERIAL:
+ ftdi->eeprom->use_serial = value;
+ break;
+ case USB_VERSION:
+ ftdi->eeprom->usb_version = value;
+ break;
+ case MAX_POWER:
+ ftdi->eeprom->max_power = value;
+ break;
+ case CHANNEL_A_TYPE:
+ ftdi->eeprom->channel_a_type = value;
+ break;
+ case CHANNEL_B_TYPE:
+ ftdi->eeprom->channel_b_type = value;
+ break;
+ case CHANNEL_A_DRIVER:
+ ftdi->eeprom->channel_a_driver = value;
+ break;
+ case CHANNEL_B_DRIVER:
+ ftdi->eeprom->channel_b_driver = value;
+ break;
+ case CBUS_FUNCTION_0:
+ ftdi->eeprom->cbus_function[0] = value;
+ break;
+ case CBUS_FUNCTION_1:
+ ftdi->eeprom->cbus_function[1] = value;
+ break;
+ case CBUS_FUNCTION_2:
+ ftdi->eeprom->cbus_function[2] = value;
+ break;
+ case CBUS_FUNCTION_3:
+ ftdi->eeprom->cbus_function[3] = value;
+ break;
+ case CBUS_FUNCTION_4:
+ ftdi->eeprom->cbus_function[4] = value;
+ break;
+ case HIGH_CURRENT:
+ ftdi->eeprom->high_current = value;
+ break;
+ case HIGH_CURRENT_A:
+ ftdi->eeprom->high_current_a = value;
+ break;
+ case HIGH_CURRENT_B:
+ ftdi->eeprom->high_current_b = value;
+ break;
+ case INVERT:
+ ftdi->eeprom->invert = value;
+ break;
+ case GROUP0_DRIVE:
+ ftdi->eeprom->group0_drive = value;
+ break;
+ case GROUP0_SCHMITT:
+ ftdi->eeprom->group0_schmitt = value;
+ break;
+ case GROUP0_SLEW:
+ ftdi->eeprom->group0_slew = value;
+ break;
+ case GROUP1_DRIVE:
+ ftdi->eeprom->group1_drive = value;
+ break;
+ case GROUP1_SCHMITT:
+ ftdi->eeprom->group1_schmitt = value;
+ break;
+ case GROUP1_SLEW:
+ ftdi->eeprom->group1_slew = value;
+ break;
+ case GROUP2_DRIVE:
+ ftdi->eeprom->group2_drive = value;
+ break;
+ case GROUP2_SCHMITT:
+ ftdi->eeprom->group2_schmitt = value;
+ break;
+ case GROUP2_SLEW:
+ ftdi->eeprom->group2_slew = value;
+ break;
+ case GROUP3_DRIVE:
+ ftdi->eeprom->group3_drive = value;
+ break;
+ case GROUP3_SCHMITT:
+ ftdi->eeprom->group3_schmitt = value;
+ break;
+ case GROUP3_SLEW:
+ ftdi->eeprom->group3_slew = value;
+ break;
+ case CHIP_TYPE:
+ ftdi->eeprom->chip = value;
+ break;
+ case CHIP_SIZE:
+ ftdi_error_return(-2, "EEPROM Value can't be changed");
+ default :
+ ftdi_error_return(-1, "Request to unknown EEPROM value");
+ }
+ return 0;
+}
+
+/** Get the rea -only buffer to the binary EEPROM content
+
+ \param ftdi pointer to ftdi_context
+ \param ftdi buffer to receive EEPROM content
+ \param size Size of receiving buffer
+
+ \retval 0: All fine
+ \retval -1: struct ftdi_contxt or ftdi_eeprom missing
+*/
+int ftdi_get_eeprom_buf(struct ftdi_context *ftdi, unsigned char * buf, int
size)
+ {
+ if (!ftdi || !(ftdi->eeprom))
+ ftdi_error_return(-1, "No appropriate structure");
+ memcpy(buf, ftdi->eeprom->buf, size);
+ return 0;
+ }
+
+/**
Read eeprom location
\param ftdi pointer to ftdi_context
diff --git a/src/ftdi.h b/src/ftdi.h
index 5fe1b4a..0de2e9b 100644
--- a/src/ftdi.h
+++ b/src/ftdi.h
@@ -314,6 +314,53 @@ struct ftdi_context
};
/**
+ List all handled EEPROM values.
+ Append future new values only at the end to provide API/ABI stability*/
+enum ftdi_eeprom_value
+{
+ VENDOR_ID = 0,
+ PRODUCT_ID = 1,
+ SELF_POWERED = 2,
+ REMOTE_WAKEUP = 3,
+ IS_NOT_PNP = 4,
+ SUSPEND_DBUS7 = 5,
+ IN_IS_ISOCHRONOUS = 6,
+ OUT_IS_ISOCHRONOUS = 7,
+ SUSPEND_PULL_DOWNS = 8,
+ USE_SERIAL = 9,
+ USB_VERSION = 10,
+ USE_USB_VERSION = 11,
+ MAX_POWER = 12,
+ CHANNEL_A_TYPE = 13,
+ CHANNEL_B_TYPE = 14,
+ CHANNEL_A_DRIVER = 15,
+ CHANNEL_B_DRIVER = 16,
+ CBUS_FUNCTION_0 = 17,
+ CBUS_FUNCTION_1 = 18,
+ CBUS_FUNCTION_2 = 19,
+ CBUS_FUNCTION_3 = 20,
+ CBUS_FUNCTION_4 = 21,
+ HIGH_CURRENT = 22,
+ HIGH_CURRENT_A = 23,
+ HIGH_CURRENT_B = 24,
+ INVERT = 25,
+ GROUP0_DRIVE = 26,
+ GROUP0_SCHMITT = 27,
+ GROUP0_SLEW = 28,
+ GROUP1_DRIVE = 29,
+ GROUP1_SCHMITT = 30,
+ GROUP1_SLEW = 31,
+ GROUP2_DRIVE = 32,
+ GROUP2_SCHMITT = 33,
+ GROUP2_SLEW = 34,
+ GROUP3_DRIVE = 35,
+ GROUP3_SCHMITT = 36,
+ GROUP3_SLEW = 37,
+ CHIP_SIZE = 38,
+ CHIP_TYPE = 39
+};
+
+/**
\brief list of usb devices created by ftdi_usb_find_all()
*/
struct ftdi_device_list
@@ -477,6 +524,11 @@ extern "C"
int ftdi_eeprom_build(struct ftdi_context *ftdi);
int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose);
+ int ftdi_get_eeprom_value(struct ftdi_context *ftdi, enum
ftdi_eeprom_value value_name, int* value);
+ int ftdi_set_eeprom_value(struct ftdi_context *ftdi, enum
ftdi_eeprom_value value_name, int value);
+
+ int ftdi_get_eeprom_buf(struct ftdi_context *ftdi, unsigned char * buf,
int size);
+
int ftdi_read_eeprom(struct ftdi_context *ftdi);
int ftdi_read_chipid(struct ftdi_context *ftdi, unsigned int *chipid);
int ftdi_write_eeprom(struct ftdi_context *ftdi);
--
1.7.1
--
libftdi - see http://www.intra2net.com/en/developer/libftdi for details.
To unsubscribe send a mail to libftdi+unsubscribe@xxxxxxxxxxxxxxxxxxxxxxx
|