}
else if (dev->descriptor.bcdDevice == 0x600)
ftdi->type = TYPE_R;
+ else if (dev->descriptor.bcdDevice == 0x700)
+ ftdi->type = TYPE_2232H;
+ else if (dev->descriptor.bcdDevice == 0x800)
+ ftdi->type = TYPE_4232H;
ftdi_error_return(0, "all fine");
}
int ftdi_read_data(struct ftdi_context *ftdi, unsigned char *buf, int size)
{
int offset = 0, ret = 1, i, num_of_chunks, chunk_remains;
+ int packet_size;
+
+ // New hi-speed devices from FTDI use a packet size of 512 bytes
+ if (ftdi->type == TYPE_2232H || ftdi->type == TYPE_4232H)
+ packet_size = 512;
+ else
+ packet_size = 64;
// everything we want is still in the readbuffer?
if (size <= ftdi->readbuffer_remaining)
{
// skip FTDI status bytes.
// Maybe stored in the future to enable modem use
- num_of_chunks = ret / 64;
- chunk_remains = ret % 64;
+ num_of_chunks = ret / packet_size;
+ chunk_remains = ret % packet_size;
//printf("ret = %X, num_of_chunks = %X, chunk_remains = %X, readbuffer_offset = %X\n", ret, num_of_chunks, chunk_remains, ftdi->readbuffer_offset);
ftdi->readbuffer_offset += 2;
ret -= 2;
- if (ret > 62)
+ if (ret > packet_size - 2)
{
for (i = 1; i < num_of_chunks; i++)
- memmove (ftdi->readbuffer+ftdi->readbuffer_offset+62*i,
- ftdi->readbuffer+ftdi->readbuffer_offset+64*i,
- 62);
+ memmove (ftdi->readbuffer+ftdi->readbuffer_offset+(packet_size - 2)*i,
+ ftdi->readbuffer+ftdi->readbuffer_offset+packet_size*i,
+ packet_size - 2);
if (chunk_remains > 2)
{
- memmove (ftdi->readbuffer+ftdi->readbuffer_offset+62*i,
- ftdi->readbuffer+ftdi->readbuffer_offset+64*i,
+ memmove (ftdi->readbuffer+ftdi->readbuffer_offset+(packet_size - 2)*i,
+ ftdi->readbuffer+ftdi->readbuffer_offset+packet_size*i,
chunk_remains-2);
ret -= 2*num_of_chunks;
}
// Addr 04: Product ID
eeprom->product_id = buf[0x04] + (buf[0x05] << 8);
- switch (buf[0x06] + (buf[0x07]<<8))
+ value = buf[0x06] + (buf[0x07]<<8);
+ switch (value)
{
case 0x0400:
eeprom->BM_type_chip = 1;
int ftdi_write_eeprom(struct ftdi_context *ftdi, unsigned char *eeprom)
{
unsigned short usb_val, status;
- int i;
+ int i, ret;
/* These commands were traced while running MProg */
- ftdi_usb_reset(ftdi);
- ftdi_poll_modem_status(ftdi, &status);
- ftdi_set_latency_timer(ftdi, 0x77);
+ if ((ret = ftdi_usb_reset(ftdi)) != 0)
+ return ret;
+ if ((ret = ftdi_poll_modem_status(ftdi, &status)) != 0)
+ return ret;
+ if ((ret = ftdi_set_latency_timer(ftdi, 0x77)) != 0)
+ return ret;
for (i = 0; i < ftdi->eeprom_size/2; i++)
{