X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Ftarget%2Fcortex_swjdp.c;h=91367fcea4e200032c9e6227330160472e081c85;hp=d1983ec56e49767a50bec201ec282d3ca5796ea3;hb=68c598e88d5e09728ea845a81ab279c615bbaf0f;hpb=d47e1b8f362379d8a2307f49e2b42115a3f40524 diff --git a/src/target/cortex_swjdp.c b/src/target/cortex_swjdp.c index d1983ec56e..91367fcea4 100644 --- a/src/target/cortex_swjdp.c +++ b/src/target/cortex_swjdp.c @@ -2,6 +2,9 @@ * Copyright (C) 2006 by Magnus Lundin * * lundin@mlu.mine.nu * * * + * Copyright (C) 2008 by Spencer Oliver * + * spen@spen-soft.co.uk * + * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * @@ -171,12 +174,28 @@ int scan_inout_check_u32(swjdp_common_t *swjdp, u8 instr, u8 reg_addr, u8 RnW, u int swjdp_transaction_endcheck(swjdp_common_t *swjdp) { + int retval; int waitcount = 0; u32 ctrlstat; + keep_alive(); + + /* Danger!!!! BROKEN!!!! */ scan_inout_check_u32(swjdp, SWJDP_IR_DPACC, DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat); + /* Danger!!!! BROKEN!!!! Why will jtag_execute_queue() fail here???? + R956 introduced the check on return value here and now Michael Schwingen reports + that this code no longer works.... + + https://lists.berlios.de/pipermail/openocd-development/2008-September/003107.html + */ + if ((retval=jtag_execute_queue())!=ERROR_OK) + { + LOG_ERROR("BUG: Why does this fail the first time????"); + } + /* Why??? second time it works??? */ scan_inout_check_u32(swjdp, SWJDP_IR_DPACC, DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat); - jtag_execute_queue(); + if ((retval=jtag_execute_queue())!=ERROR_OK) + return retval; swjdp->ack = swjdp->ack & 0x7; @@ -198,7 +217,8 @@ int swjdp_transaction_endcheck(swjdp_common_t *swjdp) } scan_inout_check_u32(swjdp, SWJDP_IR_DPACC, DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat); - jtag_execute_queue(); + if ((retval=jtag_execute_queue())!=ERROR_OK) + return retval; swjdp->ack = swjdp->ack & 0x7; } @@ -224,7 +244,8 @@ int swjdp_transaction_endcheck(swjdp_common_t *swjdp) /* Clear Sticky Error Bits */ scan_inout_check_u32(swjdp, SWJDP_IR_DPACC, DP_CTRL_STAT, DPAP_WRITE, swjdp->dp_ctrl_stat | SSTICKYORUN | SSTICKYERR, NULL); scan_inout_check_u32(swjdp, SWJDP_IR_DPACC, DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat); - jtag_execute_queue(); + if ((retval=jtag_execute_queue())!=ERROR_OK) + return retval; LOG_DEBUG("swjdp: status 0x%x", ctrlstat); @@ -235,7 +256,8 @@ int swjdp_transaction_endcheck(swjdp_common_t *swjdp) ahbap_read_system_atomic_u32(swjdp, NVIC_BFAR, &nvic_bfar); LOG_ERROR("dcb_dhcsr 0x%x, nvic_shcsr 0x%x, nvic_cfsr 0x%x, nvic_bfar 0x%x", dcb_dhcsr, nvic_shcsr, nvic_cfsr, nvic_bfar); } - jtag_execute_queue(); + if ((retval=jtag_execute_queue())!=ERROR_OK) + return retval; return ERROR_JTAG_DEVICE_ERROR; } @@ -941,6 +963,7 @@ int ahbap_debugport_init(swjdp_common_t *swjdp) u32 idreg, romaddr, dummy; u32 ctrlstat; int cnt = 0; + int retval; LOG_DEBUG(" "); @@ -955,23 +978,26 @@ int ahbap_debugport_init(swjdp_common_t *swjdp) swjdp_write_dpacc(swjdp, swjdp->dp_ctrl_stat, DP_CTRL_STAT); swjdp_read_dpacc(swjdp, &ctrlstat, DP_CTRL_STAT); - jtag_execute_queue(); + if ((retval=jtag_execute_queue())!=ERROR_OK) + return retval; /* Check that we have debug power domains activated */ while (!(ctrlstat & CDBGPWRUPACK) && (cnt++ < 10)) { LOG_DEBUG("swjdp: wait CDBGPWRUPACK"); swjdp_read_dpacc(swjdp, &ctrlstat, DP_CTRL_STAT); - jtag_execute_queue(); - usleep(10000); + if ((retval=jtag_execute_queue())!=ERROR_OK) + return retval; + alive_sleep(10); } while (!(ctrlstat & CSYSPWRUPACK) && (cnt++ < 10)) { LOG_DEBUG("swjdp: wait CSYSPWRUPACK"); swjdp_read_dpacc(swjdp, &ctrlstat, DP_CTRL_STAT); - jtag_execute_queue(); - usleep(10000); + if ((retval=jtag_execute_queue())!=ERROR_OK) + return retval; + alive_sleep(10); } swjdp_read_dpacc(swjdp, &dummy, DP_CTRL_STAT);