From d2f3d2fc85ba30a178a89fe134fedd01ba71e3ac Mon Sep 17 00:00:00 2001
From: Ali Lown <ali@lown.me.uk>
Date: Sat, 2 Apr 2011 21:40:00 +0100
Subject: [PATCH 1/2] Implement 64bit buffer for USB Blaster.

Sends 64bits of JTAG info per 64bit packet, instead of just 1.
---
 src/jtag/drivers/usb_blaster.c |   37 +++++++++++++++++++++++++++++++------
 1 files changed, 31 insertions(+), 6 deletions(-)

diff --git a/src/jtag/drivers/usb_blaster.c b/src/jtag/drivers/usb_blaster.c
index 8330493..ae18ba2 100644
--- a/src/jtag/drivers/usb_blaster.c
+++ b/src/jtag/drivers/usb_blaster.c
@@ -4,6 +4,10 @@
  *     (http://www.ixo.de/info/usb_jtag/).                                 *
  *   Some updates by Anthony Liu (2006).                                   *
  *   Minor updates and cleanup by Catalin Patulea (2009).                  *
+ *   Speed updates by Ali Lown (2011).
+ *
+ *   Copyright (C) 2011 Ali Lown
+ *   ali@lown.me.uk
  *                                                                         *
  *   Copyright (C) 2009 Catalin Patulea                                    *
  *   cat@vv.carleton.ca                                                    *
@@ -106,6 +110,9 @@ static uint16_t usb_blaster_pid = 0x6001; /* USB-Blaster */
 
 /* last output byte in simple bit banging mode */
 static uint8_t out_value;
+#define BUF_LEN 64
+static uint8_t out_buffer[BUF_LEN];
+static uint16_t out_count = 0;
 
 #if BUILD_USB_BLASTER_FTD2XX == 1
 static FT_HANDLE ftdih;
@@ -241,10 +248,14 @@ usb_blaster_buf_read(uint8_t *buf, unsigned size, uint32_t *bytes_read)
 
 #define READ_TDO	(1 << 0)
 
-static void usb_blaster_write_data(void)
+static void usb_blaster_write_databuffer(uint8_t* buf, uint16_t len)
 {
 	uint32_t bytes_written;
-	usb_blaster_buf_write(&out_value, 1, &bytes_written);
+	usb_blaster_buf_write(buf, len, &bytes_written);
+	out_count = 0;
+#ifdef _DEBUG_JTAG_IO_
+	LOG_DEBUG("---- WROTE %d",bytes_written);
+#end if;
 }
 
 static int usb_blaster_read_data(void)
@@ -253,8 +264,11 @@ static int usb_blaster_read_data(void)
 	uint8_t buf[1];
 	uint32_t bytes_read;
 
+	if(out_count > 0)
+		usb_blaster_write_databuffer(out_buffer, out_count);
+
 	out_value |= READ;
-	usb_blaster_write_data();
+	usb_blaster_write_databuffer(&out_value,1);
 	out_value &= ~READ;
 
 	status = usb_blaster_buf_read(buf, 1, &bytes_read);
@@ -264,6 +278,14 @@ static int usb_blaster_read_data(void)
 	return !!(buf[0] & READ_TDO);
 }
 
+static void usb_blaster_addtowritebuffer(uint8_t, bool forcewrite)
+{
+	out_buffer[out_count] = value;
+	out_count += 1;
+	if(out_count == BUF_LEN || forcewrite)
+			usb_blaster_writedatabuffer(out_buffer, out_count);
+}
+
 static void usb_blaster_write(int tck, int tms, int tdi)
 {
 #ifdef _DEBUG_JTAG_IO_
@@ -277,7 +299,7 @@ static void usb_blaster_write(int tck, int tms, int tdi)
 	if (tdi)
 		out_value |= TDI;
 
-	usb_blaster_write_data();
+	usb_blaster_addtowritebuffer(out_value, false);
 }
 
 static int usb_blaster_speed(int speed)
@@ -469,6 +491,9 @@ static int usb_blaster_init(void)
 
 static int usb_blaster_quit(void)
 {
+	if(out_count > 0)
+		usb_blaster_writedatabuffer(out_buffer, out_count);
+
 #if BUILD_USB_BLASTER_FTD2XX == 1
 	FT_STATUS status;
 
@@ -534,12 +559,12 @@ COMMAND_HANDLER(usb_blaster_handle_pin_command)
 		if (state == 0)
 		{
 			out_value &= ~mask;
-			usb_blaster_write_data();
+			usb_blaster_write_databuffer(&out_value,1);
 		}
 		else if (state == 1)
 		{
 			out_value |= mask;
-			usb_blaster_write_data();
+			usb_blaster_write_databuffer(&out_value,1);
 		}
 		else
 		{
-- 
1.7.3.4

