summaryrefslogtreecommitdiff
path: root/src/jtag
diff options
context:
space:
mode:
authordrath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2006-08-31 12:41:49 +0000
committerdrath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2006-08-31 12:41:49 +0000
commit3acb107b9ae4e3d38d3fcfd29b455ebcfb444696 (patch)
treeb44896670fc255dad7c80d20321c3e1e0252f446 /src/jtag
parentda9eedc0f2c338b8ad136a4436a7781edc4a8884 (diff)
downloadopenocd+libswd-3acb107b9ae4e3d38d3fcfd29b455ebcfb444696.tar.gz
openocd+libswd-3acb107b9ae4e3d38d3fcfd29b455ebcfb444696.tar.bz2
openocd+libswd-3acb107b9ae4e3d38d3fcfd29b455ebcfb444696.tar.xz
openocd+libswd-3acb107b9ae4e3d38d3fcfd29b455ebcfb444696.zip
- 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
Diffstat (limited to 'src/jtag')
-rw-r--r--src/jtag/Makefile.am8
-rw-r--r--src/jtag/ft2232.c6
-rw-r--r--src/jtag/jtag.c47
-rw-r--r--src/jtag/jtag.h2
4 files changed, 50 insertions, 13 deletions
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,
@@ -156,6 +160,9 @@ jtag_interface_t *jtag_interfaces[] = {
#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