diff options
author | oharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2009-02-23 21:26:11 +0000 |
---|---|---|
committer | oharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2009-02-23 21:26:11 +0000 |
commit | 39d80bad9bb405dab262ab2c4bedaef18d8c1df8 (patch) | |
tree | a9bc66ad9fa3e84a367ec15d5d07584a82f8e738 /src/target/cortex_swjdp.c | |
parent | ba9d608df3ddbda5d8e451a26ee7e2cbe99d6938 (diff) |
tinkered a bit with performance for Cortex flash programming. Mainly make it easier to profile as a start.
git-svn-id: svn://svn.berlios.de/openocd/trunk@1380 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src/target/cortex_swjdp.c')
-rw-r--r-- | src/target/cortex_swjdp.c | 41 |
1 files changed, 25 insertions, 16 deletions
diff --git a/src/target/cortex_swjdp.c b/src/target/cortex_swjdp.c index 974ced02..3e094d84 100644 --- a/src/target/cortex_swjdp.c +++ b/src/target/cortex_swjdp.c @@ -5,6 +5,9 @@ * Copyright (C) 2008 by Spencer Oliver * * spen@spen-soft.co.uk * * * + * Copyright (C) 2009 by Oyvind Harboe * + * oyvind.harboe@zylin.com * + * * * 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 * @@ -178,7 +181,7 @@ int swjdp_transaction_endcheck(swjdp_common_t *swjdp) int retval; u32 ctrlstat; - keep_alive(); + /* too expensive to call keep_alive() here */ /* Danger!!!! BROKEN!!!! */ scan_inout_check_u32(swjdp, SWJDP_IR_DPACC, DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat); @@ -199,27 +202,33 @@ int swjdp_transaction_endcheck(swjdp_common_t *swjdp) swjdp->ack = swjdp->ack & 0x7; - long long then=timeval_ms(); - while (swjdp->ack != 2) + if (swjdp->ack != 2) { - if (swjdp->ack == 1) + long long then=timeval_ms(); + while (swjdp->ack != 2) { - if ((timeval_ms()-then) > 1000) + if (swjdp->ack == 1) { - LOG_WARNING("Timeout (1000ms) waiting for ACK = OK/FAULT in SWJDP transaction"); + if ((timeval_ms()-then) > 1000) + { + LOG_WARNING("Timeout (1000ms) waiting for ACK = OK/FAULT in SWJDP transaction"); + return ERROR_JTAG_DEVICE_ERROR; + } + } + else + { + LOG_WARNING("Invalid ACK in SWJDP transaction"); return ERROR_JTAG_DEVICE_ERROR; } - } - else - { - LOG_WARNING("Invalid ACK in SWJDP transaction"); - return ERROR_JTAG_DEVICE_ERROR; - } - scan_inout_check_u32(swjdp, SWJDP_IR_DPACC, DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat); - if ((retval=jtag_execute_queue())!=ERROR_OK) - return retval; - swjdp->ack = swjdp->ack & 0x7; + scan_inout_check_u32(swjdp, SWJDP_IR_DPACC, DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat); + if ((retval=jtag_execute_queue())!=ERROR_OK) + return retval; + swjdp->ack = swjdp->ack & 0x7; + } + } else + { + /* common code path avoids fn to timeval_ms() */ } /* Check for STICKYERR and STICKYORUN */ |