From: Spencer Oliver Date: Wed, 18 Sep 2013 21:41:54 +0000 (+0100) Subject: adiv5: check packed transfers are supported X-Git-Tag: v0.8.0-rc1~259 X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=commitdiff_plain;h=1304b27d2accf7a761ff3b0c12fd5332b3c0c4da 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 Reviewed-on: http://openocd.zylin.com/1602 Tested-by: jenkins Reviewed-by: Andreas Fritiofson --- diff --git a/src/target/arm_adi_v5.c b/src/target/arm_adi_v5.c index ce92f4cc98..5e9091f729 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 e2e83e11e9..7cc90b2415 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; }; /**