Skip to content

Commit 7e65a37

Browse files
committed
at32f43x: Extend read unprotect to JTAG transport
1 parent 4cb8013 commit 7e65a37

File tree

1 file changed

+45
-2
lines changed

1 file changed

+45
-2
lines changed

src/target/at32f43x.c

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,47 @@ static bool at32f43_mass_erase(target_s *target)
551551
return true;
552552
}
553553

554-
static bool at32f43x_swd_raw_access_noabort(adiv5_debug_port_s *dp, uint8_t rnw, uint16_t addr, uint32_t value)
554+
/* Borrow macros from adiv5_jtag.c */
555+
#define JTAGDP_ACK_OK 0x02U
556+
#define JTAGDP_ACK_WAIT 0x01U
557+
558+
#define IR_DPACC 0xaU
559+
#define IR_APACC 0xbU
560+
561+
uint32_t adiv5_jtag_raw_access_noabort(adiv5_debug_port_s *dp, uint8_t rnw, uint16_t addr, uint32_t value)
562+
{
563+
const bool is_ap = addr & ADIV5_APnDP;
564+
addr &= 0xffU;
565+
566+
const uint64_t request = ((uint64_t)value << 3U) | ((addr >> 1U) & 0x06U) | (rnw ? 1U : 0U);
567+
568+
uint32_t result = 0U;
569+
uint8_t ack = JTAGDP_ACK_WAIT;
570+
571+
jtag_dev_write_ir(dp->dev_index, is_ap ? IR_APACC : IR_DPACC);
572+
573+
platform_timeout_s timeout_progressbar;
574+
platform_timeout_set(&timeout_progressbar, 500U);
575+
platform_timeout_s timeout_erase;
576+
platform_timeout_set(&timeout_erase, 15000U);
577+
while (ack == JTAGDP_ACK_WAIT && !platform_timeout_is_expired(&timeout_erase)) {
578+
uint64_t response;
579+
jtag_dev_shift_dr(dp->dev_index, (uint8_t *)&response, (uint8_t *)&request, 35);
580+
result = response >> 3U;
581+
ack = response & 0x07U;
582+
platform_delay(5U);
583+
target_print_progress(&timeout_progressbar);
584+
}
585+
586+
if (ack != JTAGDP_ACK_OK) {
587+
DEBUG_ERROR("JTAG access resulted in: %" PRIx32 ":%x\n", result, ack);
588+
raise_exception(EXCEPTION_ERROR, "JTAG-DP invalid ACK");
589+
}
590+
591+
return result;
592+
}
593+
594+
static bool adiv5_swd_raw_access_noabort(adiv5_debug_port_s *dp, uint8_t rnw, uint16_t addr, uint32_t value)
555595
{
556596
const uint8_t request = make_packet_request(rnw, addr);
557597
uint32_t response = 0;
@@ -612,7 +652,10 @@ static bool at32f43x_mem_write_noabort(target_s *target, target_addr32_t dest, u
612652
volatile uint32_t rdbuff = 0;
613653
TRY (EXCEPTION_ALL) {
614654
//ack = ap->dp->low_access(dp, rnw, addr, value)
615-
rdbuff = at32f43x_swd_raw_access_noabort(ap->dp, ADIV5_LOW_READ, ADIV5_DP_RDBUFF, 0);
655+
if (ap->dp->low_access == adiv5_swd_raw_access)
656+
rdbuff = adiv5_swd_raw_access_noabort(ap->dp, ADIV5_LOW_READ, ADIV5_DP_RDBUFF, 0);
657+
else if (ap->dp->low_access == adiv5_jtag_raw_access)
658+
rdbuff = adiv5_jtag_raw_access_noabort(ap->dp, ADIV5_LOW_READ, ADIV5_DP_RDBUFF, 0);
616659
}
617660
CATCH () {
618661
case EXCEPTION_TIMEOUT:

0 commit comments

Comments
 (0)