- reverted some of the changes that possibly broke arm926ejs. Waiting
for a bit more info before I can tell with confidence whether or not this would have any effect. - worked on error propagation and output for flash git-svn-id: svn://svn.berlios.de/openocd/trunk@539 b42882b7-edfa-0310-969c-e2dbd0fdcd60
This commit is contained in:
parent
7abe97565e
commit
35b3c95299
|
@ -211,10 +211,9 @@ int loadDriver(ecosflash_flash_bank_t *info)
|
||||||
int retval;
|
int retval;
|
||||||
if ((retval = image_read_section(&image, i, 0x0, image.sections[i].size, buffer, &buf_cnt)) != ERROR_OK)
|
if ((retval = image_read_section(&image, i, 0x0, image.sections[i].size, buffer, &buf_cnt)) != ERROR_OK)
|
||||||
{
|
{
|
||||||
LOG_ERROR("image_read_section failed with error code: %i", retval);
|
|
||||||
free(buffer);
|
free(buffer);
|
||||||
image_close(&image);
|
image_close(&image);
|
||||||
return ERROR_FLASH_BANK_INVALID;
|
return retval;
|
||||||
}
|
}
|
||||||
target_write_buffer(target, image.sections[i].base_address, buf_cnt, buffer);
|
target_write_buffer(target, image.sections[i].base_address, buf_cnt, buffer);
|
||||||
image_size += buf_cnt;
|
image_size += buf_cnt;
|
||||||
|
@ -303,7 +302,7 @@ int eCosBoard_erase(ecosflash_flash_bank_t *info, u32 address, u32 len)
|
||||||
if (flashErr != 0x0)
|
if (flashErr != 0x0)
|
||||||
{
|
{
|
||||||
LOG_ERROR("Flash erase failed with %d (%s)\n", flashErr, flash_errmsg(flashErr));
|
LOG_ERROR("Flash erase failed with %d (%s)\n", flashErr, flash_errmsg(flashErr));
|
||||||
return ERROR_JTAG_DEVICE_ERROR;
|
return ERROR_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
|
@ -362,7 +361,7 @@ int eCosBoard_flash(ecosflash_flash_bank_t *info, void *data, u32 address, u32 l
|
||||||
if (flashErr != 0x0)
|
if (flashErr != 0x0)
|
||||||
{
|
{
|
||||||
LOG_ERROR("Flash prog failed with %d (%s)\n", flashErr, flash_errmsg(flashErr));
|
LOG_ERROR("Flash prog failed with %d (%s)\n", flashErr, flash_errmsg(flashErr));
|
||||||
return ERROR_JTAG_DEVICE_ERROR;
|
return ERROR_FAIL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
|
|
|
@ -618,13 +618,12 @@ int handle_flash_write_image_command(struct command_context_s *cmd_ctx, char *cm
|
||||||
if (argc < 1)
|
if (argc < 1)
|
||||||
{
|
{
|
||||||
return ERROR_COMMAND_SYNTAX_ERROR;
|
return ERROR_COMMAND_SYNTAX_ERROR;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!target)
|
if (!target)
|
||||||
{
|
{
|
||||||
LOG_ERROR("no target selected");
|
LOG_ERROR("no target selected");
|
||||||
return ERROR_OK;
|
return ERROR_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
duration_start_measure(&duration);
|
duration_start_measure(&duration);
|
||||||
|
@ -649,7 +648,6 @@ int handle_flash_write_image_command(struct command_context_s *cmd_ctx, char *cm
|
||||||
}
|
}
|
||||||
|
|
||||||
retval = flash_write(target, &image, &written, auto_erase);
|
retval = flash_write(target, &image, &written, auto_erase);
|
||||||
|
|
||||||
if (retval != ERROR_OK)
|
if (retval != ERROR_OK)
|
||||||
{
|
{
|
||||||
image_close(&image);
|
image_close(&image);
|
||||||
|
@ -923,7 +921,7 @@ int flash_erase_address_range(target_t *target, u32 addr, u32 length)
|
||||||
/* write (optional verify) an image to flash memory of the given target */
|
/* write (optional verify) an image to flash memory of the given target */
|
||||||
int flash_write(target_t *target, image_t *image, u32 *written, int erase)
|
int flash_write(target_t *target, image_t *image, u32 *written, int erase)
|
||||||
{
|
{
|
||||||
int retval;
|
int retval=ERROR_OK;
|
||||||
|
|
||||||
int section;
|
int section;
|
||||||
u32 section_offset;
|
u32 section_offset;
|
||||||
|
@ -1046,7 +1044,7 @@ int flash_write(target_t *target, image_t *image, u32 *written, int erase)
|
||||||
*written += run_size; /* add run size to total written counter */
|
*written += run_size; /* add run size to total written counter */
|
||||||
}
|
}
|
||||||
|
|
||||||
return ERROR_OK;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
int handle_flash_auto_erase_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
|
int handle_flash_auto_erase_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
|
||||||
|
|
|
@ -298,6 +298,7 @@ void command_print(command_context_t *context, char *format, ...)
|
||||||
int find_and_run_command(command_context_t *context, command_t *commands, char *words[], int num_words, int start_word)
|
int find_and_run_command(command_context_t *context, command_t *commands, char *words[], int num_words, int start_word)
|
||||||
{
|
{
|
||||||
command_t *c;
|
command_t *c;
|
||||||
|
int retval = ERROR_COMMAND_SYNTAX_ERROR;
|
||||||
|
|
||||||
if (unique_length_dirty)
|
if (unique_length_dirty)
|
||||||
{
|
{
|
||||||
|
@ -321,6 +322,7 @@ int find_and_run_command(command_context_t *context, command_t *commands, char *
|
||||||
if (!c->handler)
|
if (!c->handler)
|
||||||
{
|
{
|
||||||
command_print(context, "No handler for command");
|
command_print(context, "No handler for command");
|
||||||
|
retval = ERROR_COMMAND_SYNTAX_ERROR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -330,6 +332,12 @@ int find_and_run_command(command_context_t *context, command_t *commands, char *
|
||||||
{
|
{
|
||||||
command_print(context, "Syntax error:");
|
command_print(context, "Syntax error:");
|
||||||
command_print_help_line(context, c, 0);
|
command_print_help_line(context, c, 0);
|
||||||
|
} else if (retval != ERROR_OK)
|
||||||
|
{
|
||||||
|
/* we do not print out an error message because the command *should*
|
||||||
|
* have printed out an error
|
||||||
|
*/
|
||||||
|
LOG_DEBUG("Command failed with error code %d", retval);
|
||||||
}
|
}
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
@ -347,7 +355,7 @@ int find_and_run_command(command_context_t *context, command_t *commands, char *
|
||||||
}
|
}
|
||||||
|
|
||||||
command_print(context, "Command %s not found", words[start_word]);
|
command_print(context, "Command %s not found", words[start_word]);
|
||||||
return ERROR_OK;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
int command_run_line(command_context_t *context, char *line)
|
int command_run_line(command_context_t *context, char *line)
|
||||||
|
|
|
@ -34,6 +34,20 @@ typedef struct command_context_s
|
||||||
enum command_mode mode;
|
enum command_mode mode;
|
||||||
struct command_s *commands;
|
struct command_s *commands;
|
||||||
int current_target;
|
int current_target;
|
||||||
|
/* Execute a command.
|
||||||
|
*
|
||||||
|
* If the command fails, it *MUST* return a value != ERROR_OK
|
||||||
|
* (many commands break this rule, patches welcome!)
|
||||||
|
*
|
||||||
|
* This is *especially* important for commands such as writing
|
||||||
|
* to flash or verifying memory. The reason is that those commands
|
||||||
|
* can be used by programs to determine if the operation succeded
|
||||||
|
* or not. If the operation failed, then a program can try
|
||||||
|
* an alternative approach.
|
||||||
|
*
|
||||||
|
* Returning ERROR_COMMAND_SYNTAX_ERROR will have the effect of
|
||||||
|
* printing out the syntax of the command.
|
||||||
|
*/
|
||||||
int (*output_handler)(struct command_context_s *context, char* line);
|
int (*output_handler)(struct command_context_s *context, char* line);
|
||||||
void *output_handler_priv;
|
void *output_handler_priv;
|
||||||
} command_context_t;
|
} command_context_t;
|
||||||
|
|
|
@ -23,7 +23,8 @@ nobase_dist_pkglib_DATA = xscale/debug_handler.bin event/at91eb40a_reset.script
|
||||||
target/at91r40008.cfg target/lpc2148.cfg target/lpc2294.cfg target/sam7s256.cfg \
|
target/at91r40008.cfg target/lpc2148.cfg target/lpc2294.cfg target/sam7s256.cfg \
|
||||||
target/sam7x256.cfg target/str710.cfg target/str912.cfg target/nslu2.cfg target/pxa255_sst.cfg \
|
target/sam7x256.cfg target/str710.cfg target/str912.cfg target/nslu2.cfg target/pxa255_sst.cfg \
|
||||||
target/pxa255.cfg target/zy1000.cfg event/zy1000_reset.script event/at91sam9260_reset.script target/at91sam9260.cfg \
|
target/pxa255.cfg target/zy1000.cfg event/zy1000_reset.script event/at91sam9260_reset.script target/at91sam9260.cfg \
|
||||||
target/wi-9c.cfg event/wi-9c_reset.script event/pxa255_reset.script target/stm32.cfg target/xba_revA3.cfg event/xba_revA3.script
|
target/wi-9c.cfg event/wi-9c_reset.script event/pxa255_reset.script target/stm32.cfg target/xba_revA3.cfg event/xba_revA3.script \
|
||||||
|
ecos/at91eb40a.elf
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -732,7 +732,7 @@ int arm11_halt(struct target_s *target)
|
||||||
|
|
||||||
if (target->state == TARGET_HALTED)
|
if (target->state == TARGET_HALTED)
|
||||||
{
|
{
|
||||||
LOG_WARNING("target was already halted");
|
LOG_DEBUG("target was already halted");
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -733,8 +733,18 @@ int arm7_9_poll(target_t *target)
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Some -S targets (ARM966E-S in the STR912 isn't affected, ARM926EJ-S
|
||||||
|
in the LPC3180 and AT91SAM9260 is affected) completely stop the JTAG clock
|
||||||
|
while the core is held in reset. It isn't possible to program the halt
|
||||||
|
condition once reset was asserted, hence a hook that allows the target to set
|
||||||
|
up its reset-halt condition prior to asserting reset.
|
||||||
|
*/
|
||||||
|
|
||||||
int arm7_9_assert_reset(target_t *target)
|
int arm7_9_assert_reset(target_t *target)
|
||||||
{
|
{
|
||||||
|
armv4_5_common_t *armv4_5 = target->arch_info;
|
||||||
|
arm7_9_common_t *arm7_9 = armv4_5->arch_info;
|
||||||
LOG_DEBUG("target->state: %s", target_state_strings[target->state]);
|
LOG_DEBUG("target->state: %s", target_state_strings[target->state]);
|
||||||
|
|
||||||
if (!(jtag_reset_config & RESET_HAS_SRST))
|
if (!(jtag_reset_config & RESET_HAS_SRST))
|
||||||
|
@ -743,10 +753,32 @@ int arm7_9_assert_reset(target_t *target)
|
||||||
return ERROR_FAIL;
|
return ERROR_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Some targets do not support communication while TRST is asserted. We need to
|
||||||
|
* set up the reset vector catch here.
|
||||||
|
*
|
||||||
|
* If TRST is in use, then these settings will be reset anyway, so setting them
|
||||||
|
* here is harmless.
|
||||||
|
*/
|
||||||
|
if (arm7_9->has_vector_catch)
|
||||||
|
{
|
||||||
|
/* program vector catch register to catch reset vector */
|
||||||
|
embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_VEC_CATCH], 0x1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* program watchpoint unit to match on reset vector address */
|
||||||
|
embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_ADDR_MASK], 0x3);
|
||||||
|
embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_DATA_MASK], 0x0);
|
||||||
|
embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_VALUE], 0x100);
|
||||||
|
embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_MASK], 0xf7);
|
||||||
|
}
|
||||||
|
|
||||||
/* we can't know what state the target is in as we might e.g.
|
/* we can't know what state the target is in as we might e.g.
|
||||||
* be resetting after a power dropout, so we need to issue a tms/srst
|
* be resetting after a power dropout, so we need to issue a tms/srst
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/* assert SRST and TRST */
|
/* assert SRST and TRST */
|
||||||
/* system would get ouf sync if we didn't reset test-logic, too */
|
/* system would get ouf sync if we didn't reset test-logic, too */
|
||||||
jtag_add_reset(1, 1);
|
jtag_add_reset(1, 1);
|
||||||
|
@ -766,10 +798,6 @@ int arm7_9_assert_reset(target_t *target)
|
||||||
target->state = TARGET_RESET;
|
target->state = TARGET_RESET;
|
||||||
jtag_add_sleep(50000);
|
jtag_add_sleep(50000);
|
||||||
|
|
||||||
/* at this point we TRST *may* be deasserted */
|
|
||||||
arm7_9_prepare_reset_halt(target);
|
|
||||||
|
|
||||||
|
|
||||||
armv4_5_invalidate_core_regs(target);
|
armv4_5_invalidate_core_regs(target);
|
||||||
|
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
|
@ -909,15 +937,6 @@ int arm7_9_soft_reset_halt(struct target_s *target)
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int arm7_9_prepare_reset_halt(target_t *target)
|
|
||||||
{
|
|
||||||
if ((target->reset_mode!=RESET_HALT)&&(target->reset_mode!=RESET_INIT))
|
|
||||||
{
|
|
||||||
return ERROR_OK;
|
|
||||||
}
|
|
||||||
return arm7_9_halt(target);
|
|
||||||
}
|
|
||||||
|
|
||||||
int arm7_9_halt(target_t *target)
|
int arm7_9_halt(target_t *target)
|
||||||
{
|
{
|
||||||
armv4_5_common_t *armv4_5 = target->arch_info;
|
armv4_5_common_t *armv4_5 = target->arch_info;
|
||||||
|
@ -928,7 +947,7 @@ int arm7_9_halt(target_t *target)
|
||||||
|
|
||||||
if (target->state == TARGET_HALTED)
|
if (target->state == TARGET_HALTED)
|
||||||
{
|
{
|
||||||
LOG_WARNING("target was already halted");
|
LOG_DEBUG("target was already halted");
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -429,7 +429,7 @@ int cortex_m3_halt(target_t *target)
|
||||||
|
|
||||||
if (target->state == TARGET_HALTED)
|
if (target->state == TARGET_HALTED)
|
||||||
{
|
{
|
||||||
LOG_WARNING("target was already halted");
|
LOG_DEBUG("target was already halted");
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -2053,14 +2053,13 @@ int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, ch
|
||||||
|
|
||||||
if (argc < 1)
|
if (argc < 1)
|
||||||
{
|
{
|
||||||
command_print(cmd_ctx, "usage: verify_image <file> [offset] [type]");
|
return ERROR_COMMAND_SYNTAX_ERROR;
|
||||||
return ERROR_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!target)
|
if (!target)
|
||||||
{
|
{
|
||||||
LOG_ERROR("no target selected");
|
LOG_ERROR("no target selected");
|
||||||
return ERROR_OK;
|
return ERROR_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
duration_start_measure(&duration);
|
duration_start_measure(&duration);
|
||||||
|
@ -2078,9 +2077,9 @@ int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, ch
|
||||||
|
|
||||||
image.start_address_set = 0;
|
image.start_address_set = 0;
|
||||||
|
|
||||||
if (image_open(&image, args[0], (argc == 3) ? args[2] : NULL) != ERROR_OK)
|
if ((retval=image_open(&image, args[0], (argc == 3) ? args[2] : NULL)) != ERROR_OK)
|
||||||
{
|
{
|
||||||
return ERROR_OK;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
image_size = 0x0;
|
image_size = 0x0;
|
||||||
|
|
|
@ -14,7 +14,6 @@ reset_config srst_only srst_pulls_trst
|
||||||
jtag_device 4 0x1 0xf 0xe
|
jtag_device 4 0x1 0xf 0xe
|
||||||
|
|
||||||
#target configuration
|
#target configuration
|
||||||
#target arm7tdmi <endianness> <reset mode> <chainpos> <variant>
|
|
||||||
target arm7tdmi little reset_init 0 arm7tdmi-s_r4
|
target arm7tdmi little reset_init 0 arm7tdmi-s_r4
|
||||||
|
|
||||||
# speed up memory downloads
|
# speed up memory downloads
|
||||||
|
@ -24,6 +23,9 @@ arm7_9 dcc_downloads enable
|
||||||
# OpenOCD does not have a flash driver for for AT91FR40162S
|
# OpenOCD does not have a flash driver for for AT91FR40162S
|
||||||
target_script 0 reset event/at91eb40a_reset.script
|
target_script 0 reset event/at91eb40a_reset.script
|
||||||
|
|
||||||
|
#flash driver
|
||||||
|
flash bank ecosflash 0x01000000 0x200000 2 2 0 ecos/at91eb40a.elf
|
||||||
|
|
||||||
# required for usable performance. Used for lots of
|
# required for usable performance. Used for lots of
|
||||||
# other things than flash programming.
|
# other things than flash programming.
|
||||||
working_area 0 0x00000000 0x20000 nobackup
|
working_area 0 0x00000000 0x20000 nobackup
|
||||||
|
|
|
@ -14,7 +14,6 @@ reset_config srst_only srst_pulls_trst
|
||||||
jtag_device 4 0x1 0xf 0xe
|
jtag_device 4 0x1 0xf 0xe
|
||||||
|
|
||||||
#target configuration
|
#target configuration
|
||||||
#target arm7tdmi <endianness> <reset mode> <chainpos> <variant>
|
|
||||||
target arm7tdmi little reset_init 0 arm7tdmi-s_r4
|
target arm7tdmi little reset_init 0 arm7tdmi-s_r4
|
||||||
|
|
||||||
# at CPU CLK <32kHz this must be disabled
|
# at CPU CLK <32kHz this must be disabled
|
||||||
|
@ -22,7 +21,7 @@ arm7 fast_memory_access enable
|
||||||
arm7_9 dcc_downloads enable
|
arm7_9 dcc_downloads enable
|
||||||
|
|
||||||
|
|
||||||
flash bank ecosflash 0x01000000 0x200000 2 2 0 /rom/at91eb40a.elf
|
flash bank ecosflash 0x01000000 0x200000 2 2 0 ecos/at91eb40a.elf
|
||||||
target_script 0 reset event/zy1000_reset.script
|
target_script 0 reset event/zy1000_reset.script
|
||||||
|
|
||||||
# required for usable performance. Used for lots of
|
# required for usable performance. Used for lots of
|
||||||
|
|
|
@ -1263,7 +1263,7 @@ int xscale_halt(target_t *target)
|
||||||
|
|
||||||
if (target->state == TARGET_HALTED)
|
if (target->state == TARGET_HALTED)
|
||||||
{
|
{
|
||||||
LOG_WARNING("target was already halted");
|
LOG_DEBUG("target was already halted");
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
else if (target->state == TARGET_UNKNOWN)
|
else if (target->state == TARGET_UNKNOWN)
|
||||||
|
|
Loading…
Reference in New Issue