Browse Source

ftdi: ft232h_mpsse_readwrite_all function to do both reading and writing concurrently in MPSSE mode

Luke Dashjr 11 years ago
parent
commit
96d1d35567
2 changed files with 29 additions and 0 deletions
  1. 28 0
      ft232r.c
  2. 1 0
      ft232r.h

+ 28 - 0
ft232r.c

@@ -467,6 +467,34 @@ bool ft232h_mpsse_set_axbus(struct ft232r_device_handle * const ftdi, const uint
 	return (ft232r_write(ftdi, buf, 3) == 3) && (ft232r_flush(ftdi) == 3);
 }
 
+ssize_t ft232h_mpsse_readwrite_all(struct ft232r_device_handle * const dev, void * const read_data_p, const void * const write_data_p, size_t count)
+{
+	uint8_t *read_data = read_data_p;
+	const uint8_t *write_data = write_data_p;
+	
+	while (count > 0x10000)
+	{
+		ft232h_mpsse_readwrite_all(dev, read_data, write_data, 0x10000);
+		read_data += 0x10000;
+		write_data += 0x10000;
+		count -= 0x10000;
+	}
+	
+	const uint16_t ftdilen = count - 1;
+	const uint8_t cmd[] = { 0x31, ftdilen & 0xff, ftdilen >> 8 };
+	ssize_t e;
+	
+	e = ft232r_rw_all(ft232r_write, dev, (void*)cmd, 3);
+	if (e != 3)
+		return e;
+	
+	e = ft232r_rw_all(ft232r_write, dev, (void*)write_data, count);
+	if (e != count)
+		return e;
+	
+	return ft232r_read_all(dev, read_data, count) + (read_data - (uint8_t*)read_data_p);
+}
+
 struct lowlevel_driver lowl_ft232r = {
 	.dname = "ft232r",
 	.devinfo_scan = ft232r_devinfo_scan,

+ 1 - 0
ft232r.h

@@ -41,5 +41,6 @@ extern bool ft232r_get_cbus_bits(struct ft232r_device_handle *dev, bool *out_sio
 extern bool ft232h_mpsse_set_axbus(struct ft232r_device_handle *, uint8_t value, uint8_t directions, bool adbus);
 #define ft232h_mpsse_set_acbus(ftdi, val, dir)  ft232h_mpsse_set_axbus(ftdi, val, dir, false)
 #define ft232h_mpsse_set_adbus(ftdi, val, dir)  ft232h_mpsse_set_axbus(ftdi, val, dir, true)
+extern ssize_t ft232h_mpsse_readwrite_all(struct ft232r_device_handle *, void *read_data, const void *write_data, size_t count);
 
 #endif