From 39cfe6279616a69b858ddd3493d61ed7133ff081 Mon Sep 17 00:00:00 2001 From: David Brownell Date: Sun, 21 Feb 2010 14:53:15 -0800 Subject: ARM: ADIv5 code shrinkage, cleanup adi_jtag_dp_scan_u32() now wraps adi_jtag_dp_scan(), removing code duplication. Include doxygen for the former. Comment some particularly relevant points. Minor fault handling fixes for both routines: don't register a callback that can't run, or return ERROR_OK after an error. Signed-off-by: David Brownell --- src/target/arm_adi_v5.c | 56 ++++++++++++++----------------------------------- 1 file changed, 16 insertions(+), 40 deletions(-) (limited to 'src/target/arm_adi_v5.c') diff --git a/src/target/arm_adi_v5.c b/src/target/arm_adi_v5.c index 1eff3355..d7afb585 100644 --- a/src/target/arm_adi_v5.c +++ b/src/target/arm_adi_v5.c @@ -158,58 +158,34 @@ static int adi_jtag_dp_scan(struct swjdp_common *swjdp, jtag_add_dr_scan(2, fields, jtag_get_end_state()); - return ERROR_OK; + return jtag_get_error(); } -/* Scan out and in from host ordered uint32_t variables */ +/** + * Scan DPACC or APACC out and in from host ordered uint32_t buffers. + * This is exactly like adi_jtag_dp_scan(), except that endianness + * conversions are performed (so the types of invalue and outvalue + * must be different). + */ static int adi_jtag_dp_scan_u32(struct swjdp_common *swjdp, uint8_t instr, uint8_t reg_addr, uint8_t RnW, uint32_t outvalue, uint32_t *invalue, uint8_t *ack) { - struct arm_jtag *jtag_info = swjdp->jtag_info; - struct scan_field fields[2]; uint8_t out_value_buf[4]; - uint8_t out_addr_buf; - - jtag_set_end_state(TAP_IDLE); - arm_jtag_set_instr(jtag_info, instr, NULL); - - /* Add specified number of tck clocks before accessing memory bus */ - - /* REVISIT these TCK cycles should be *AFTER* updating APACC, since - * they provide more time for the (MEM) AP to complete the read ... - */ - if ((instr == JTAG_DP_APACC) - && ((reg_addr == AP_REG_DRW) - || ((reg_addr & 0xF0) == AP_REG_BD0)) - && (swjdp->memaccess_tck != 0)) - jtag_add_runtest(swjdp->memaccess_tck, jtag_set_end_state(TAP_IDLE)); - - fields[0].tap = jtag_info->tap; - fields[0].num_bits = 3; - buf_set_u32(&out_addr_buf, 0, 3, ((reg_addr >> 1) & 0x6) | (RnW & 0x1)); - fields[0].out_value = &out_addr_buf; - fields[0].in_value = ack; + int retval; - fields[1].tap = jtag_info->tap; - fields[1].num_bits = 32; buf_set_u32(out_value_buf, 0, 32, outvalue); - fields[1].out_value = out_value_buf; - fields[1].in_value = NULL; - - if (invalue) - { - fields[1].in_value = (uint8_t *)invalue; - jtag_add_dr_scan(2, fields, jtag_get_end_state()); - jtag_add_callback(arm_le_to_h_u32, (jtag_callback_data_t) invalue); - } else - { + retval = adi_jtag_dp_scan(swjdp, instr, reg_addr, RnW, + out_value_buf, (uint8_t *)invalue, ack); + if (retval != ERROR_OK) + return retval; - jtag_add_dr_scan(2, fields, jtag_get_end_state()); - } + if (invalue) + jtag_add_callback(arm_le_to_h_u32, + (jtag_callback_data_t) invalue); - return ERROR_OK; + return retval; } /* scan_inout_check adds one extra inscan for DPAP_READ commands to read variables */ -- cgit v1.2.3