- 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
This commit is contained in:
@@ -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;
|
||||
u8 *captured = buf_set_buf(buffer, bit_count, malloc(CEIL(num_bits, 8)), 0, num_bits);
|
||||
#ifdef _DEBUG_JTAG_IO_
|
||||
char *char_buf;
|
||||
|
||||
char_buf = buf_to_char(captured, num_bits);
|
||||
DEBUG("fields[%i].in_value: %s", i, char_buf);
|
||||
free(char_buf);
|
||||
#endif
|
||||
|
||||
|
||||
if (cmd->fields[i].in_value)
|
||||
{
|
||||
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_
|
||||
DEBUG("fields[%i].in_value: %s", i, char_buf);
|
||||
#endif
|
||||
free(char_buf);
|
||||
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;
|
||||
|
||||
Reference in New Issue
Block a user