diff options
author | Spencer Oliver <spen@spen-soft.co.uk> | 2013-09-18 22:41:54 +0100 |
---|---|---|
committer | Andreas Fritiofson <andreas.fritiofson@gmail.com> | 2013-09-20 20:39:34 +0000 |
commit | 1304b27d2accf7a761ff3b0c12fd5332b3c0c4da (patch) | |
tree | 6c53b26378cf58aa2de252abc617c041cc3ac137 /src | |
parent | 5aafcec96e1b5bd10866cb721db075027003bce6 (diff) |
adiv5: check packed transfers are supported
Currently we try and use MEM-AP packed transfers as much as possible for
8/16bit transfers. However not all targets support packed transfers, so
check before using.
Change-Id: I66256007f25ccd0c583f23db5acf6d1aa8b5e57d
Signed-off-by: Spencer Oliver <spen@spen-soft.co.uk>
Reviewed-on: http://openocd.zylin.com/1602
Tested-by: jenkins
Reviewed-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/target/arm_adi_v5.c | 31 | ||||
-rw-r--r-- | src/target/arm_adi_v5.h | 3 |
2 files changed, 30 insertions, 4 deletions
diff --git a/src/target/arm_adi_v5.c b/src/target/arm_adi_v5.c index ce92f4cc..5e9091f7 100644 --- a/src/target/arm_adi_v5.c +++ b/src/target/arm_adi_v5.c @@ -416,7 +416,7 @@ int mem_ap_write_buf_u16(struct adiv5_dap *dap, const uint8_t *buffer, int count { int retval = ERROR_OK; - if (count >= 4) + if (dap->packed_transfers && count >= 4) return mem_ap_write_buf_packed_u16(dap, buffer, count, address); while (count > 0) { @@ -516,7 +516,7 @@ int mem_ap_write_buf_u8(struct adiv5_dap *dap, const uint8_t *buffer, int count, { int retval = ERROR_OK; - if (count >= 4) + if (dap->packed_transfers && count >= 4) return mem_ap_write_buf_packed_u8(dap, buffer, count, address); while (count > 0) { @@ -685,7 +685,7 @@ int mem_ap_read_buf_u16(struct adiv5_dap *dap, uint8_t *buffer, uint32_t invalue, i; int retval = ERROR_OK; - if (count >= 4) + if (dap->packed_transfers && count >= 4) return mem_ap_read_buf_packed_u16(dap, buffer, count, address); while (count > 0) { @@ -787,7 +787,7 @@ int mem_ap_read_buf_u8(struct adiv5_dap *dap, uint8_t *buffer, uint32_t invalue; int retval = ERROR_OK; - if (count >= 4) + if (dap->packed_transfers && count >= 4) return mem_ap_read_buf_packed_u8(dap, buffer, count, address); while (count > 0) { @@ -1164,6 +1164,29 @@ int ahbap_debugport_init(struct adiv5_dap *dap) dap_syssec(dap); + /* check that we support packed transfers */ + uint32_t csw; + + retval = dap_setup_accessport(dap, CSW_8BIT | CSW_ADDRINC_PACKED, 0); + if (retval != ERROR_OK) + return retval; + + retval = dap_queue_ap_read(dap, AP_REG_CSW, &csw); + if (retval != ERROR_OK) + return retval; + + retval = dap_run(dap); + if (retval != ERROR_OK) + return retval; + + if (csw & CSW_ADDRINC_PACKED) + dap->packed_transfers = true; + else + dap->packed_transfers = false; + + LOG_DEBUG("MEM_AP Packed Transfers: %s", + dap->packed_transfers ? "enabled" : "disabled"); + return ERROR_OK; } diff --git a/src/target/arm_adi_v5.h b/src/target/arm_adi_v5.h index e2e83e11..7cc90b24 100644 --- a/src/target/arm_adi_v5.h +++ b/src/target/arm_adi_v5.h @@ -186,6 +186,9 @@ struct adiv5_dap { /* Size of TAR autoincrement block, ARM ADI Specification requires at least 10 bits */ uint32_t tar_autoincr_block; + + /* true if packed transfers are supported by the MEM-AP */ + bool packed_transfers; }; /** |