From 3acb107b9ae4e3d38d3fcfd29b455ebcfb444696 Mon Sep 17 00:00:00 2001 From: drath Date: Thu, 31 Aug 2006 12:41:49 +0000 Subject: - endianess fixes everywhere but in the flash code. flashing might still be broken on big-endian targets and/or hosts - added access to ARM920T vector catch register (via generic register mechanism) - don't disable linefills on ARM920T cores - this lead to lockups when accessing lines already contained in cache - read content of ARM920T cache and tlb into file (arm920t read_flash/read_mmu commands) - memory reading improved on ARM7/9, can be further accelerated with new "arm7_9 fast_memory_access enable" command (renamed from fast_writes) - made in_handler independent from in field (makes the handler more flexible) - added timeout to ft2232 when using D2XX library - fixed STR7x protection bit handling on second bank (thanks to Bernard) - added support for using the OpenOCD on AT91RM9200 systems (thanks to Anders Larsen) - fixed AT91SAM7 flash handling when not running from 32kHz clock (thanks to Anders Larsen) git-svn-id: svn://svn.berlios.de/openocd/trunk@90 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- src/jtag/Makefile.am | 8 +++++++- src/jtag/ft2232.c | 6 ++++++ src/jtag/jtag.c | 47 ++++++++++++++++++++++++++++++++++++----------- src/jtag/jtag.h | 2 +- 4 files changed, 50 insertions(+), 13 deletions(-) (limited to 'src/jtag') diff --git a/src/jtag/Makefile.am b/src/jtag/Makefile.am index ec46111e..c63c734a 100644 --- a/src/jtag/Makefile.am +++ b/src/jtag/Makefile.am @@ -49,6 +49,12 @@ else EP93XXFILES = endif -libjtag_a_SOURCES = jtag.c $(BITBANGFILES) $(PARPORTFILES) $(FT2232FILES) $(AMTJTAGACCELFILES) $(EP93XXFILES) +if AT91RM9200 +AT91RM9200FILES = at91rm9200.c +else +AT91RM9200FILES = +endif + +libjtag_a_SOURCES = jtag.c $(BITBANGFILES) $(PARPORTFILES) $(FT2232FILES) $(AMTJTAGACCELFILES) $(EP93XXFILES) $(AT91RM9200FILES) noinst_HEADERS = bitbang.h jtag.h diff --git a/src/jtag/ft2232.c b/src/jtag/ft2232.c index 7d2fac08..c1973a3c 100644 --- a/src/jtag/ft2232.c +++ b/src/jtag/ft2232.c @@ -1009,6 +1009,12 @@ int ft2232_init(void) { DEBUG("current latency timer: %i", latency_timer); } + + if ((status = FT_SetTimeouts(ftdih, 5000, 5000)) != FT_OK) + { + ERROR("unable to set timeouts: %i", status); + return ERROR_JTAG_INIT_FAILED; + } if ((status = FT_SetBitMode(ftdih, 0x0b, 2)) != FT_OK) { diff --git a/src/jtag/jtag.c b/src/jtag/jtag.c index 95818f07..b05f19d9 100644 --- a/src/jtag/jtag.c +++ b/src/jtag/jtag.c @@ -140,6 +140,10 @@ jtag_event_callback_t *jtag_event_callbacks; extern jtag_interface_t ep93xx_interface; #endif +#if BUILD_AT91RM9200 == 1 + extern jtag_interface_t at91rm9200_interface; +#endif + jtag_interface_t *jtag_interfaces[] = { #if BUILD_PARPORT == 1 &parport_interface, @@ -155,6 +159,9 @@ jtag_interface_t *jtag_interfaces[] = { #endif #if BUILD_EP93XX == 1 &ep93xx_interface, +#endif +#if BUILD_AT91RM9200 == 1 + &at91rm9200_interface, #endif NULL, }; @@ -974,20 +981,26 @@ int jtag_read_buffer(u8 *buffer, scan_command_t *cmd) for (i=0; i < cmd->num_fields; i++) { - /* if neither in_value nor in_check_value are specified we don't have to examine this field */ - if (cmd->fields[i].in_value || cmd->fields[i].in_check_value) + /* if neither in_value, in_check_value nor in_handler + * are specified we don't have to examine this field + */ + if (cmd->fields[i].in_value || cmd->fields[i].in_check_value || cmd->fields[i].in_handler) { int num_bits = cmd->fields[i].num_bits; - - if (cmd->fields[i].in_value) - { + u8 *captured = buf_set_buf(buffer, bit_count, malloc(CEIL(num_bits, 8)), 0, num_bits); + #ifdef _DEBUG_JTAG_IO_ char *char_buf; - buf_set_buf(buffer, bit_count, cmd->fields[i].in_value, 0, num_bits); - char_buf = buf_to_char(cmd->fields[i].in_value, num_bits); -#ifdef _DEBUG_JTAG_IO_ + + char_buf = buf_to_char(captured, num_bits); DEBUG("fields[%i].in_value: %s", i, char_buf); -#endif free(char_buf); + #endif + + + if (cmd->fields[i].in_value) + { + buf_cpy(captured, cmd->fields[i].in_value, num_bits); + if (cmd->fields[i].in_handler) { if (cmd->fields[i].in_handler(cmd->fields[i].in_value, cmd->fields[i].in_handler_priv) != ERROR_OK) @@ -998,6 +1011,18 @@ int jtag_read_buffer(u8 *buffer, scan_command_t *cmd) } } } + + /* no in_value specified, but a handler takes care of the scanned data */ + if (cmd->fields[i].in_handler && (!cmd->fields[i].in_value)) + { + if (cmd->fields[i].in_handler(captured, cmd->fields[i].in_handler_priv) != ERROR_OK) + { + /* TODO: error reporting */ + WARNING("in_handler reported a failed check"); + retval = ERROR_JTAG_QUEUE_FAILED; + } + + } if (cmd->fields[i].in_check_value) { @@ -1015,8 +1040,8 @@ int jtag_read_buffer(u8 *buffer, scan_command_t *cmd) free(in_check_value_char); free(in_check_mask_char); } - free(captured); } + free(captured); } bit_count += cmd->fields[i].num_bits; } @@ -1031,7 +1056,7 @@ enum scan_type jtag_scan_type(scan_command_t *cmd) for (i=0; i < cmd->num_fields; i++) { - if (cmd->fields[i].in_check_value || cmd->fields[i].in_value) + if (cmd->fields[i].in_check_value || cmd->fields[i].in_value || cmd->fields[i].in_handler) type |= SCAN_IN; if (cmd->fields[i].out_value) type |= SCAN_OUT; diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h index 19f81ce6..7ad38278 100644 --- a/src/jtag/jtag.h +++ b/src/jtag/jtag.h @@ -25,7 +25,7 @@ #include "command.h" -#if 1 +#if 0 #define _DEBUG_JTAG_IO_ #endif -- cgit v1.2.3