Browse Source

Bugfix: ft232r: First 2 bytes of every 0x40 are FTDI status or something

Luke Dashjr 13 years ago
parent
commit
7c3f964b58
1 changed files with 6 additions and 1 deletions
  1. 6 1
      ft232r.c

+ 6 - 1
ft232r.c

@@ -314,19 +314,24 @@ ssize_t ft232r_write_all(struct ft232r_device_handle *dev, void *data, size_t co
 ssize_t ft232r_read(struct ft232r_device_handle *dev, void *data, size_t count)
 ssize_t ft232r_read(struct ft232r_device_handle *dev, void *data, size_t count)
 {
 {
 	ssize_t r;
 	ssize_t r;
+	int adj;
 	
 	
 	// Flush any pending output before reading
 	// Flush any pending output before reading
 	r = ft232r_flush(dev);
 	r = ft232r_flush(dev);
 	if (r < 0)
 	if (r < 0)
 		return r;
 		return r;
 	
 	
-	// First 2 bytes are FTDI status or something
+	// First 2 bytes of every 0x40 are FTDI status or something
 	while (dev->ibufLen <= 2) {
 	while (dev->ibufLen <= 2) {
 		// TODO: Implement a timeout for status byte repeating
 		// TODO: Implement a timeout for status byte repeating
 		int transferred = ft232r_readwrite(dev, dev->i, dev->ibuf, sizeof(dev->ibuf));
 		int transferred = ft232r_readwrite(dev, dev->i, dev->ibuf, sizeof(dev->ibuf));
 		if (transferred <= 0)
 		if (transferred <= 0)
 			return transferred;
 			return transferred;
 		dev->ibufLen = transferred;
 		dev->ibufLen = transferred;
+		for (adj = 0x40; dev->ibufLen > adj; adj += 0x40 - 2) {
+			dev->ibufLen -= 2;
+			memmove(&dev->ibuf[adj], &dev->ibuf[adj+2], dev->ibufLen - adj);
+		}
 	}
 	}
 	unsigned char *ibufs = &dev->ibuf[2];
 	unsigned char *ibufs = &dev->ibuf[2];
 	size_t ibufsLen = dev->ibufLen - 2;
 	size_t ibufsLen = dev->ibufLen - 2;