X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Ftarget%2Ftarget.c;h=e3c81689d85271c4fdd3b2cbf23948bf3a7432fc;hp=19e5d6515e9ba4f88a2ed06e77a975b12639d0b9;hb=10aeff925936a43e873acfd0068b1eea03781051;hpb=d28ab08cfafb3ad7ff8dc539644883217e89f8c4;ds=sidebyside diff --git a/src/target/target.c b/src/target/target.c index 19e5d6515e..e3c81689d8 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -34,9 +34,7 @@ * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * + * along with this program. If not, see . * ***************************************************************************/ #ifdef HAVE_CONFIG_H @@ -92,6 +90,7 @@ extern struct target_type cortexm_target; extern struct target_type cortexa_target; extern struct target_type cortexr4_target; extern struct target_type arm11_target; +extern struct target_type ls1_sap_target; extern struct target_type mips_m4k_target; extern struct target_type avr_target; extern struct target_type dsp563xx_target; @@ -104,6 +103,7 @@ extern struct target_type nds32_v3_target; extern struct target_type nds32_v3m_target; extern struct target_type or1k_target; extern struct target_type quark_x10xx_target; +extern struct target_type quark_d20xx_target; static struct target_type *target_types[] = { &arm7tdmi_target, @@ -121,6 +121,7 @@ static struct target_type *target_types[] = { &cortexa_target, &cortexr4_target, &arm11_target, + &ls1_sap_target, &mips_m4k_target, &avr_target, &dsp563xx_target, @@ -133,6 +134,7 @@ static struct target_type *target_types[] = { &nds32_v3m_target, &or1k_target, &quark_x10xx_target, + &quark_d20xx_target, NULL, }; @@ -530,7 +532,7 @@ int target_poll(struct target *target) if (target->state == TARGET_HALTED) target->halt_issued = false; else { - long long t = timeval_ms() - target->halt_issued_time; + int64_t t = timeval_ms() - target->halt_issued_time; if (t > DEFAULT_HALT_TIMEOUT) { target->halt_issued = false; LOG_INFO("Halt timed out, wake up GDB."); @@ -1012,6 +1014,15 @@ int target_run_flash_async_algorithm(struct target *target, retval = retval2; } + if (retval == ERROR_OK) { + /* check if algorithm set rp = 0 after fifo writer loop finished */ + retval = target_read_u32(target, rp_addr, &rp); + if (retval == ERROR_OK && rp == 0) { + LOG_ERROR("flash write algorithm aborted by target"); + retval = ERROR_FLASH_OPERATION_FAILED; + } + } + return retval; } @@ -1930,7 +1941,8 @@ int target_arch_state(struct target *target) return ERROR_OK; } - LOG_USER("target state: %s", target_state_name(target)); + LOG_USER("%s: target state: %s", target_name(target), + target_state_name(target)); if (target->state != TARGET_HALTED) return ERROR_OK; @@ -2010,8 +2022,8 @@ static int target_profiling_default(struct target *target, uint32_t *samples, */ int target_write_buffer(struct target *target, uint32_t address, uint32_t size, const uint8_t *buffer) { - LOG_DEBUG("writing buffer of %i byte at 0x%8.8x", - (int)size, (unsigned)address); + LOG_DEBUG("writing buffer of %" PRIi32 " byte at 0x%8.8" PRIx32, + size, address); if (!target_was_examined(target)) { LOG_ERROR("Target not examined yet"); @@ -2022,10 +2034,10 @@ int target_write_buffer(struct target *target, uint32_t address, uint32_t size, return ERROR_OK; if ((address + size - 1) < address) { - /* GDB can request this when e.g. PC is 0xfffffffc*/ - LOG_ERROR("address + size wrapped(0x%08x, 0x%08x)", - (unsigned)address, - (unsigned)size); + /* GDB can request this when e.g. PC is 0xfffffffc */ + LOG_ERROR("address + size wrapped (0x%08" PRIx32 ", 0x%08" PRIx32 ")", + address, + size); return ERROR_FAIL; } @@ -2071,8 +2083,8 @@ static int target_write_buffer_default(struct target *target, uint32_t address, */ int target_read_buffer(struct target *target, uint32_t address, uint32_t size, uint8_t *buffer) { - LOG_DEBUG("reading buffer of %i byte at 0x%8.8x", - (int)size, (unsigned)address); + LOG_DEBUG("reading buffer of %" PRIi32 " byte at 0x%8.8" PRIx32, + size, address); if (!target_was_examined(target)) { LOG_ERROR("Target not examined yet"); @@ -2083,8 +2095,8 @@ int target_read_buffer(struct target *target, uint32_t address, uint32_t size, u return ERROR_OK; if ((address + size - 1) < address) { - /* GDB can request this when e.g. PC is 0xfffffffc*/ - LOG_ERROR("address + size wrapped(0x%08" PRIx32 ", 0x%08" PRIx32 ")", + /* GDB can request this when e.g. PC is 0xfffffffc */ + LOG_ERROR("address + size wrapped (0x%08" PRIx32 ", 0x%08" PRIx32 ")", address, size); return ERROR_FAIL; @@ -2141,7 +2153,7 @@ int target_checksum_memory(struct target *target, uint32_t address, uint32_t siz if (retval != ERROR_OK) { buffer = malloc(size); if (buffer == NULL) { - LOG_ERROR("error allocating buffer for section (%d bytes)", (int)size); + LOG_ERROR("error allocating buffer for section (%" PRId32 " bytes)", size); return ERROR_COMMAND_SYNTAX_ERROR; } retval = target_read_buffer(target, address, size, buffer); @@ -2242,7 +2254,7 @@ int target_read_u16(struct target *target, uint32_t address, uint16_t *value) if (retval == ERROR_OK) { *value = target_buffer_get_u16(target, value_buf); - LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%4.4x", + LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%4.4" PRIx16, address, *value); } else { @@ -2264,7 +2276,7 @@ int target_read_u8(struct target *target, uint32_t address, uint8_t *value) int retval = target_read_memory(target, address, 1, 1, value); if (retval == ERROR_OK) { - LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%2.2x", + LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%2.2" PRIx8, address, *value); } else { @@ -2327,7 +2339,7 @@ int target_write_u16(struct target *target, uint32_t address, uint16_t value) return ERROR_FAIL; } - LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%8.8x", + LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%8.8" PRIx16, address, value); @@ -2347,7 +2359,7 @@ int target_write_u8(struct target *target, uint32_t address, uint8_t value) return ERROR_FAIL; } - LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%2.2x", + LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%2.2" PRIx8, address, value); retval = target_write_memory(target, address, 1, 1, &value); @@ -2443,9 +2455,9 @@ static int sense_handler(void) if (powerRestored) runPowerRestore = 1; - long long current = timeval_ms(); - static long long lastPower; - int waitMore = lastPower + 2000 > current; + int64_t current = timeval_ms(); + static int64_t lastPower; + bool waitMore = lastPower + 2000 > current; if (powerDropout && !waitMore) { runPowerDropout = 1; lastPower = current; @@ -2458,7 +2470,7 @@ static int sense_handler(void) int srstDeasserted; srstDeasserted = prevSrstAsserted && !srstAsserted; - static long long lastSrst; + static int64_t lastSrst; waitMore = lastSrst + 2000 > current; if (srstDeasserted && !waitMore) { runSrstDeasserted = 1; @@ -2768,8 +2780,8 @@ COMMAND_HANDLER(handle_wait_halt_command) int target_wait_state(struct target *target, enum target_state state, int ms) { int retval; - long long then = 0, cur; - int once = 1; + int64_t then = 0, cur; + bool once = true; for (;;) { retval = target_poll(target); @@ -2779,7 +2791,7 @@ int target_wait_state(struct target *target, enum target_state state, int ms) break; cur = timeval_ms(); if (once) { - once = 0; + once = false; then = timeval_ms(); LOG_DEBUG("waiting for target %s...", Jim_Nvp_value2name_simple(nvp_target_state, state)->name); @@ -3218,7 +3230,7 @@ COMMAND_HANDLER(handle_load_image_command) COMMAND_HANDLER(handle_dump_image_command) { - struct fileio fileio; + struct fileio *fileio; uint8_t *buffer; int retval, retvaltemp; uint32_t address, size; @@ -3251,7 +3263,7 @@ COMMAND_HANDLER(handle_dump_image_command) if (retval != ERROR_OK) break; - retval = fileio_write(&fileio, this_run_size, buffer, &size_written); + retval = fileio_write(fileio, this_run_size, buffer, &size_written); if (retval != ERROR_OK) break; @@ -3262,16 +3274,16 @@ COMMAND_HANDLER(handle_dump_image_command) free(buffer); if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) { - int filesize; - retval = fileio_size(&fileio, &filesize); + size_t filesize; + retval = fileio_size(fileio, &filesize); if (retval != ERROR_OK) return retval; command_print(CMD_CTX, - "dumped %ld bytes in %fs (%0.3f KiB/s)", (long)filesize, + "dumped %zu bytes in %fs (%0.3f KiB/s)", filesize, duration_elapsed(&bench), duration_kbps(&bench, filesize)); } - retvaltemp = fileio_close(&fileio); + retvaltemp = fileio_close(fileio); if (retvaltemp != ERROR_OK) return retvaltemp; @@ -3910,6 +3922,8 @@ static int target_mem2array(Jim_Interp *interp, struct target *target, int argc, uint32_t count; uint32_t v; const char *varname; + const char *phys; + bool is_phys; int n, e, retval; uint32_t i; @@ -3918,8 +3932,8 @@ static int target_mem2array(Jim_Interp *interp, struct target *target, int argc, * argv[3] = memory address * argv[4] = count of times to read */ - if (argc != 4) { - Jim_WrongNumArgs(interp, 1, argv, "varname width addr nelems"); + if (argc < 4 || argc > 5) { + Jim_WrongNumArgs(interp, 1, argv, "varname width addr nelems [phys]"); return JIM_ERR; } varname = Jim_GetString(argv[0], &len); @@ -3938,6 +3952,14 @@ static int target_mem2array(Jim_Interp *interp, struct target *target, int argc, len = l; if (e != JIM_OK) return e; + is_phys = false; + if (argc > 4) { + phys = Jim_GetString(argv[4], &n); + if (!strncmp(phys, "phys", n)) + is_phys = true; + else + return JIM_ERR; + } switch (width) { case 8: width = 1; @@ -3980,7 +4002,7 @@ static int target_mem2array(Jim_Interp *interp, struct target *target, int argc, sprintf(buf, "mem2array address: 0x%08" PRIx32 " is not aligned for %" PRId32 " byte reads", addr, width); - Jim_AppendStrings(interp, Jim_GetResult(interp), buf , NULL); + Jim_AppendStrings(interp, Jim_GetResult(interp), buf, NULL); return JIM_ERR; } @@ -4003,13 +4025,16 @@ static int target_mem2array(Jim_Interp *interp, struct target *target, int argc, if (count > (buffersize / width)) count = (buffersize / width); - retval = target_read_memory(target, addr, width, count, buffer); + if (is_phys) + retval = target_read_phys_memory(target, addr, width, count, buffer); + else + retval = target_read_memory(target, addr, width, count, buffer); if (retval != ERROR_OK) { /* BOO !*/ - LOG_ERROR("mem2array: Read @ 0x%08x, w=%d, cnt=%d, failed", - (unsigned int)addr, - (int)width, - (int)count); + LOG_ERROR("mem2array: Read @ 0x%08" PRIx32 ", w=%" PRId32 ", cnt=%" PRId32 ", failed", + addr, + width, + count); Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: cannot read memory", NULL); e = JIM_ERR; @@ -4099,6 +4124,8 @@ static int target_array2mem(Jim_Interp *interp, struct target *target, uint32_t count; uint32_t v; const char *varname; + const char *phys; + bool is_phys; int n, e, retval; uint32_t i; @@ -4107,8 +4134,8 @@ static int target_array2mem(Jim_Interp *interp, struct target *target, * argv[3] = memory address * argv[4] = count to write */ - if (argc != 4) { - Jim_WrongNumArgs(interp, 0, argv, "varname width addr nelems"); + if (argc < 4 || argc > 5) { + Jim_WrongNumArgs(interp, 0, argv, "varname width addr nelems [phys]"); return JIM_ERR; } varname = Jim_GetString(argv[0], &len); @@ -4127,6 +4154,14 @@ static int target_array2mem(Jim_Interp *interp, struct target *target, len = l; if (e != JIM_OK) return e; + is_phys = false; + if (argc > 4) { + phys = Jim_GetString(argv[4], &n); + if (!strncmp(phys, "phys", n)) + is_phys = true; + else + return JIM_ERR; + } switch (width) { case 8: width = 1; @@ -4170,10 +4205,10 @@ static int target_array2mem(Jim_Interp *interp, struct target *target, } else { char buf[100]; Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); - sprintf(buf, "array2mem address: 0x%08x is not aligned for %d byte reads", - (unsigned int)addr, - (int)width); - Jim_AppendStrings(interp, Jim_GetResult(interp), buf , NULL); + sprintf(buf, "array2mem address: 0x%08" PRIx32 " is not aligned for %" PRId32 " byte reads", + addr, + width); + Jim_AppendStrings(interp, Jim_GetResult(interp), buf, NULL); return JIM_ERR; } @@ -4213,13 +4248,16 @@ static int target_array2mem(Jim_Interp *interp, struct target *target, } len -= count; - retval = target_write_memory(target, addr, width, count, buffer); + if (is_phys) + retval = target_write_phys_memory(target, addr, width, count, buffer); + else + retval = target_write_memory(target, addr, width, count, buffer); if (retval != ERROR_OK) { /* BOO !*/ - LOG_ERROR("array2mem: Write @ 0x%08x, w=%d, cnt=%d, failed", - (unsigned int)addr, - (int)width, - (int)count); + LOG_ERROR("array2mem: Write @ 0x%08" PRIx32 ", w=%" PRId32 ", cnt=%" PRId32 ", failed", + addr, + width, + count); Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "array2mem: cannot read memory", NULL); e = JIM_ERR; @@ -4917,10 +4955,7 @@ static int jim_target_reset(Jim_Interp *interp, int argc, Jim_Obj *const *argv) struct target *target = Jim_CmdPrivData(goi.interp); if (!target->tap->enabled) return jim_target_tap_disabled(interp); - if (!(target_was_examined(target))) { - LOG_ERROR("Target not examined yet"); - return ERROR_TARGET_NOT_EXAMINED; - } + if (!target->type->assert_reset || !target->type->deassert_reset) { Jim_SetResultFormatted(interp, "No target-specific reset for %s", @@ -5183,7 +5218,6 @@ static int target_create(Jim_GetOptInfo *goi) Jim_Obj *new_cmd; Jim_Cmd *cmd; const char *cp; - char *cp2; int e; int x; struct target *target; @@ -5208,10 +5242,9 @@ static int target_create(Jim_GetOptInfo *goi) } /* TYPE */ - e = Jim_GetOpt_String(goi, &cp2, NULL); + e = Jim_GetOpt_String(goi, &cp, NULL); if (e != JIM_OK) return e; - cp = cp2; struct transport *tr = get_current_transport(); if (tr->override_target) { e = tr->override_target(&cp); @@ -5666,7 +5699,7 @@ COMMAND_HANDLER(handle_fast_load_command) return ERROR_FAIL; } int i; - int ms = timeval_ms(); + int64_t ms = timeval_ms(); int size = 0; int retval = ERROR_OK; for (i = 0; i < fastload_num; i++) { @@ -5680,7 +5713,7 @@ COMMAND_HANDLER(handle_fast_load_command) size += fastload[i].length; } if (retval == ERROR_OK) { - int after = timeval_ms(); + int64_t after = timeval_ms(); command_print(CMD_CTX, "Loaded image %f kBytes/s", (float)(size/1024.0)/((float)(after-ms)/1000.0)); } return retval;