From: Uwe Bonnes Date: Sat, 2 Oct 2010 15:24:00 +0000 (+0200) Subject: Enumerate all handled EEPROM values Provide ftdi_get|set_eeprom_value to access these... X-Git-Tag: v1.0rc1~133^2~30 X-Git-Url: http://developer.intra2net.com/git/?p=libftdi;a=commitdiff_plain;h=44ef02bd31e3546576efaf5ed7db4893babe42f8 Enumerate all handled EEPROM values Provide ftdi_get|set_eeprom_value to access these properties Supply a copy of the EEPROM buffer to the user with ftdi_get_eeprom_buf e.g. for dumping --- diff --git a/src/ftdi.c b/src/ftdi.c index 5800f26..26fd27d 100644 --- a/src/ftdi.c +++ b/src/ftdi.c @@ -2977,6 +2977,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 read-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 6fad94b..820a5c7 100644 --- a/src/ftdi.h +++ b/src/ftdi.h @@ -316,6 +316,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 @@ -481,6 +528,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);