- 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:
oharboe 2008-04-04 13:47:38 +00:00
parent 7abe97565e
commit 35b3c95299
13 changed files with 81 additions and 42 deletions

View File

@ -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;

View File

@ -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)

View File

@ -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)

View File

@ -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;

View File

@ -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

View File

@ -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;
} }

View File

@ -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;
} }

View File

@ -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.

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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)