--- ftdi-015.c	2008-12-18 04:44:23.000000000 -0800
+++ ftdi.c	2009-03-23 10:04:53.000000000 -0700
@@ -412,6 +412,8 @@
             ftdi->index = INTERFACE_A;
     } else if (dev->descriptor.bcdDevice == 0x600)
         ftdi->type = TYPE_R;
+	else if (dev->descriptor.bcdDevice == 0x700)
+		ftdi->type = TYPE_2232H;
 
     ftdi_error_return(0, "all fine");
 }
@@ -1123,6 +1125,16 @@
 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;
+
+	switch (ftdi->type)
+	{
+		case TYPE_2232H:
+			packet_size = 512;
+			break;
+		default:
+			packet_size = 64;
+	}
 
     // everything we want is still in the readbuffer?
     if (size <= ftdi->readbuffer_remaining) {
@@ -1155,25 +1167,24 @@
         if (ret > 2) {
             // 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,
-                             chunk_remains-2);
+                    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;
-                } else
-                    ret -= 2*(num_of_chunks-1)+chunk_remains;
+                } 
+				else
+                    ret -= 2*(num_of_chunks-1)+chunk_remains;		
             }
         } else if (ret <= 2) {
             // no more data to read?
