Browse Source

ftdi: Use actual USB packet size for FTDI status removal

Luke Dashjr 11 years ago
parent
commit
aa0e7bc5d0
1 changed files with 5 additions and 3 deletions
  1. 5 3
      ft232r.c

+ 5 - 3
ft232r.c

@@ -79,7 +79,8 @@ struct ft232r_device_handle {
 	libusb_device_handle *h;
 	uint8_t i;
 	uint8_t o;
-	unsigned char ibuf[256];
+	int iPktSz;
+	unsigned char ibuf[0x400];
 	int ibufLen;
 	uint16_t osz;
 	unsigned char *obuf;
@@ -130,6 +131,7 @@ struct ft232r_device_handle *ft232r_open(struct lowlevel_device_info *info)
 	ftdi = calloc(1, sizeof(*ftdi));
 	ftdi->h = devh;
 	ftdi->i = altcfg->endpoint[0].bEndpointAddress;
+	ftdi->iPktSz = altcfg->endpoint[0].wMaxPacketSize;
 	ftdi->o = altcfg->endpoint[1].bEndpointAddress;
 	ftdi->osz = 0x1000;
 	ftdi->obuf = malloc(ftdi->osz);
@@ -260,14 +262,14 @@ ssize_t ft232r_read(struct ft232r_device_handle *dev, void *data, size_t count)
 	if (r < 0)
 		return r;
 	
-	// First 2 bytes of every 0x40 are FTDI status or something
+	// First 2 bytes of every packet are FTDI status or something
 	while (dev->ibufLen <= 2) {
 		// TODO: Implement a timeout for status byte repeating
 		int transferred = ft232r_readwrite(dev, dev->i, dev->ibuf, sizeof(dev->ibuf));
 		if (transferred <= 0)
 			return transferred;
 		dev->ibufLen = transferred;
-		for (adj = 0x40; dev->ibufLen > adj; adj += 0x40 - 2) {
+		for (adj = dev->iPktSz; dev->ibufLen > adj; adj += dev->iPktSz - 2) {
 			dev->ibufLen -= 2;
 			memmove(&dev->ibuf[adj], &dev->ibuf[adj+2], dev->ibufLen - adj);
 		}