Buffering for up to 64 bytes in USB Blaster.

Uses a global buffer.
Add self to acknowledgements.
This commit is contained in:
Ali Lown 2011-04-03 22:16:51 +01:00 committed by Øyvind Harboe
parent 24943498e6
commit c7a17b8466
1 changed files with 38 additions and 12 deletions

View File

@ -4,6 +4,10 @@
* (http://www.ixo.de/info/usb_jtag/). * * (http://www.ixo.de/info/usb_jtag/). *
* Some updates by Anthony Liu (2006). * * Some updates by Anthony Liu (2006). *
* Minor updates and cleanup by Catalin Patulea (2009). * * 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 * * Copyright (C) 2009 Catalin Patulea *
* cat@vv.carleton.ca * * cat@vv.carleton.ca *
@ -104,8 +108,12 @@ static char *usb_blaster_device_desc;
static uint16_t usb_blaster_vid = 0x09fb; /* Altera */ static uint16_t usb_blaster_vid = 0x09fb; /* Altera */
static uint16_t usb_blaster_pid = 0x6001; /* USB-Blaster */ static uint16_t usb_blaster_pid = 0x6001; /* USB-Blaster */
/* last output byte in simple bit banging mode */ /* last output byte in simple bit banging (legacy) mode */
static uint8_t out_value; static uint8_t out_value;
/* global output buffer for bit banging */
#define BUF_LEN 64 //Size of EP1
static uint8_t out_buffer[BUF_LEN];
static uint16_t out_count = 0;
#if BUILD_USB_BLASTER_FTD2XX == 1 #if BUILD_USB_BLASTER_FTD2XX == 1
static FT_HANDLE ftdih; static FT_HANDLE ftdih;
@ -195,8 +203,7 @@ usb_blaster_buf_read(uint8_t *buf, unsigned size, uint32_t *bytes_read)
} }
/* The following code doesn't fully utilize the possibilities of the /* The following code doesn't fully utilize the possibilities of the
* USB-Blaster. It writes one byte per JTAG pin state change at a time; it * USB-Blaster. It only buffers data up to the maximum packet size of 64 bytes.
* doesn't even try to buffer data up to the maximum packet size of 64 bytes.
* *
* Actually, the USB-Blaster offers a byte-shift mode to transmit up to 504 data * Actually, the USB-Blaster offers a byte-shift mode to transmit up to 504 data
* bits (bidirectional) in a single USB packet. A header byte has to be sent as * bits (bidirectional) in a single USB packet. A header byte has to be sent as
@ -225,8 +232,8 @@ usb_blaster_buf_read(uint8_t *buf, unsigned size, uint32_t *bytes_read)
* Bit 0 (0x01): TCK Output. * Bit 0 (0x01): TCK Output.
* *
* For transmitting a single data bit, you need to write two bytes. Up to 64 * For transmitting a single data bit, you need to write two bytes. Up to 64
* bytes can be combined in a single USB packet (but this is not done in the * bytes can be combined in a single USB packet.
* code below). It isn't possible to read a data without transmitting data. * It isn't possible to read a data without transmitting data.
*/ */
#define TCK (1 << 0) #define TCK (1 << 0)
@ -241,10 +248,22 @@ usb_blaster_buf_read(uint8_t *buf, unsigned size, uint32_t *bytes_read)
#define READ_TDO (1 << 0) #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; 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);
#endif
}
static void usb_blaster_addtowritebuffer(uint8_t value, bool forcewrite)
{
out_buffer[out_count] = value;
out_count += 1;
if(out_count == BUF_LEN || forcewrite)
usb_blaster_write_databuffer(out_buffer, out_count);
} }
static int usb_blaster_read_data(void) static int usb_blaster_read_data(void)
@ -253,8 +272,11 @@ static int usb_blaster_read_data(void)
uint8_t buf[1]; uint8_t buf[1];
uint32_t bytes_read; uint32_t bytes_read;
if(out_count > 0)
usb_blaster_write_databuffer(out_buffer, out_count);
out_value |= READ; out_value |= READ;
usb_blaster_write_data(); usb_blaster_addtowritebuffer(out_value, true);
out_value &= ~READ; out_value &= ~READ;
status = usb_blaster_buf_read(buf, 1, &bytes_read); status = usb_blaster_buf_read(buf, 1, &bytes_read);
@ -277,7 +299,7 @@ static void usb_blaster_write(int tck, int tms, int tdi)
if (tdi) if (tdi)
out_value |= TDI; out_value |= TDI;
usb_blaster_write_data(); usb_blaster_addtowritebuffer(out_value, false);
} }
static int usb_blaster_speed(int speed) static int usb_blaster_speed(int speed)
@ -312,7 +334,8 @@ static void usb_blaster_blink(int state)
out_value = 0x00; out_value = 0x00;
if(state) if(state)
out_value |= LED; out_value |= LED;
usb_blaster_write_data();
usb_blaster_addtowritebuffer(out_value, true);
} }
static struct bitbang_interface usb_blaster_bitbang = { static struct bitbang_interface usb_blaster_bitbang = {
@ -478,6 +501,9 @@ static int usb_blaster_init(void)
static int usb_blaster_quit(void) static int usb_blaster_quit(void)
{ {
if(out_count > 0)
usb_blaster_write_databuffer(out_buffer, out_count);
#if BUILD_USB_BLASTER_FTD2XX == 1 #if BUILD_USB_BLASTER_FTD2XX == 1
FT_STATUS status; FT_STATUS status;
@ -543,12 +569,12 @@ COMMAND_HANDLER(usb_blaster_handle_pin_command)
if (state == 0) if (state == 0)
{ {
out_value &= ~mask; out_value &= ~mask;
usb_blaster_write_data(); usb_blaster_addtowritebuffer(out_value, true);
} }
else if (state == 1) else if (state == 1)
{ {
out_value |= mask; out_value |= mask;
usb_blaster_write_data(); usb_blaster_addtowritebuffer(out_value, true);
} }
else else
{ {