From 9e6cec0dd3301395345777cfe2617559a868f2a9 Mon Sep 17 00:00:00 2001 From: mifi Date: Sun, 9 Dec 2007 15:36:21 +0000 Subject: [PATCH] - added patch to display device information as INFO too - added patch which fixes a crash upon flash write error - added patch which will improve the reset handling when SRST is tied to TRST (thanks to Oyvind Harboe for these patches) git-svn-id: svn://svn.berlios.de/openocd/trunk@218 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- src/flash/flash.c | 16 +++++++++++++--- src/jtag/jtag.c | 2 +- src/target/target.c | 27 ++++++++++++++++++++++----- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/flash/flash.c b/src/flash/flash.c index 03ee46f34..390e37ad5 100644 --- a/src/flash/flash.c +++ b/src/flash/flash.c @@ -570,10 +570,19 @@ int handle_flash_write_image_command(struct command_context_s *cmd_ctx, char *cm failed = malloc(sizeof(int) * image.num_sections); - if ((retval = flash_write(target, &image, &written, &error_str, failed, auto_erase)) != ERROR_OK) + error_str=NULL; + retval = flash_write(target, &image, &written, &error_str, failed, auto_erase); + + if (retval != ERROR_OK) { - command_print(cmd_ctx, "failed writing image %s: %s", args[0], error_str); - free(error_str); + if (error_str) + { + command_print(cmd_ctx, "failed writing image %s: %s", args[0], error_str); + free(error_str); + } + image_close(&image); + free(failed); + return retval; } for (i = 0; i < image.num_sections; i++) @@ -938,3 +947,4 @@ int handle_flash_auto_erase_command(struct command_context_s *cmd_ctx, char *cmd return ERROR_OK; } + diff --git a/src/jtag/jtag.c b/src/jtag/jtag.c index 5a390070b..09cffef79 100644 --- a/src/jtag/jtag.c +++ b/src/jtag/jtag.c @@ -1287,7 +1287,7 @@ int jtag_examine_chain() part = (idcode & 0xffff000) >> 12; version = (idcode & 0xf0000000) >> 28; - DEBUG("JTAG device found: 0x%8.8x (Manufacturer: 0x%3.3x, Part: 0x%4.4x, Version: 0x%1.1x", + INFO("JTAG device found: 0x%8.8x (Manufacturer: 0x%3.3x, Part: 0x%4.4x, Version: 0x%1.1x)", idcode, manufacturer, part, version); bit_count += 32; diff --git a/src/target/target.c b/src/target/target.c index f9d957d69..0874010c0 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -313,6 +313,23 @@ int target_process_reset(struct command_context_s *cmd_ctx) while (target) { target->type->deassert_reset(target); + + switch (target->reset_mode) + { + case RESET_INIT: + case RESET_HALT: + // If we're already halted, then this is harmless(reducing # of execution paths here) + // If nSRST & nTRST are tied together then the halt during reset failed(logged) and + // we use this as fallback(there is no other output to tell the user that reset halt + // didn't work). + target->type->poll(target); + target->type->halt(target); + break; + default: + break; + } + + target = target->next; } jtag_execute_queue(); @@ -1047,7 +1064,7 @@ int handle_target_command(struct command_context_s *cmd_ctx, char *cmd, char **a (*last_target_p)->trace_info->trace_history_overflowed = 0; (*last_target_p)->dbgmsg = NULL; - + (*last_target_p)->type->target_command(cmd_ctx, cmd, args, argc, *last_target_p); found = 1; @@ -1188,8 +1205,7 @@ int handle_target(void *priv) if (target_continous_poll) if ((retval = target->type->poll(target)) < 0) { - ERROR("couldn't poll target, exiting"); - exit(-1); + ERROR("couldn't poll target. It's due for a reset."); } } @@ -1860,7 +1876,7 @@ int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, ch if (!target) { ERROR("no target selected"); - return ERROR_OK; + return ERROR_OK; } duration_start_measure(&duration); @@ -1875,7 +1891,7 @@ int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, ch image.base_address_set = 0; image.base_address = 0x0; } - + image.start_address_set = 0; if (image_open(&image, args[0], (argc == 3) ? args[2] : NULL) != ERROR_OK) @@ -2085,3 +2101,4 @@ int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char **args return ERROR_OK; } +