ftdi.c - description
-------------------
begin : Fri Apr 4 2003
- copyright : (C) 2003-2010 by Intra2net AG
+ copyright : (C) 2003-2011 by Intra2net AG and the libftdi developers
email : opensource@intra2net.com
***************************************************************************/
struct ftdi_transfer_control *ftdi_write_data_submit(struct ftdi_context *ftdi, unsigned char *buf, int size)
{
struct ftdi_transfer_control *tc;
- struct libusb_transfer *transfer = libusb_alloc_transfer(0);
+ struct libusb_transfer *transfer;
int write_size, ret;
if (ftdi == NULL || ftdi->usb_dev == NULL)
- {
- libusb_free_transfer(transfer);
return NULL;
- }
tc = (struct ftdi_transfer_control *) malloc (sizeof (*tc));
+ if (!tc)
+ return NULL;
- if (!tc || !transfer)
+ transfer = libusb_alloc_transfer(0);
+ if (!transfer)
+ {
+ free(tc);
return NULL;
+ }
tc->ftdi = ftdi;
tc->completed = 0;
if (ret < 0)
{
libusb_free_transfer(transfer);
- tc->completed = 1;
- tc->transfer = NULL;
+ free(tc);
return NULL;
}
tc->transfer = transfer;
case TYPE_2232H: // six extra config bytes + 4 bytes PnP stuff
case TYPE_4232H:
user_area_size = 86;
+ break;
default:
user_area_size = 0;
break;
"IOMODE","BB_WR","BB_RD"
};
char *cbus_BB[] = {"RXF","TXE","RD", "WR"};
- int i;
if (eeprom->invert)
{
fprintf(stdout,"C%d Function: %s\n", i,
cbus_mux[eeprom->cbus_function[i]]);
else
+ {
+ /* FIXME for Uwe: This results in an access above array bounds.
+ Also I couldn't find documentation about this mode.
fprintf(stdout,"C%d BB Function: %s\n", i,
cbus_BB[i]);
+ */
+ fprintf(stdout, "Unknown CBUS mode. Might be special mode?\n");
+ (void)cbus_BB;
+ }
}
}
}
/**
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
+ \param ftdi pointer to ftdi_context
+ \param value_name Enum of the value to query
+ \param value Pointer to store read value
- \\retval 0: all fine
- \\retval -1: Value doesn't exist
+ \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)
{
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
+ \param ftdi pointer to ftdi_context
+ \param value_name Enum of the value to set
+ \param value to set
- \\retval 0: all fine
- \\retval -1: Value doesn't exist
- \\retval -2: Value not user settable
+ \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)
{
/** Get the read-only buffer to the binary EEPROM content
\param ftdi pointer to ftdi_context
- \param ftdi buffer to receive EEPROM content
+ \param buf buffer to receive EEPROM content
\param size Size of receiving buffer
\retval 0: All fine
{
if (!ftdi || !(ftdi->eeprom))
ftdi_error_return(-1, "No appropriate structure");
+
+ // Only copy up to FTDI_MAX_EEPROM_SIZE bytes
+ if (size > FTDI_MAX_EEPROM_SIZE)
+ size = FTDI_MAX_EEPROM_SIZE;
+
memcpy(buf, ftdi->eeprom->buf, size);
+
return 0;
}